架构师训练营 - 总结 3

用户头像
进击的炮灰
关注
发布于: 2020 年 06 月 25 日
架构师训练营-总结3

1.什么是设计模式

<1>每一种设计模式都描述了一些重复出现问题的解决方案

<2>设计模式本身是一种可重复使用的解决方案。

2.设计模式的作用

根据OOD的目标(设计低耦合,高内聚的程序),体现了设计原则(OCP,LSP,DIP,SRP,ISP),被大量用来设计实现软件系统的框架,使框架能够对应用业务代码进行契约式约束,增加代码可重用性和可维护性,让代码更容易被他人理解、保证代码可靠性,使代码编写真正工程化。



3.设计模式的构成

<1>模式名称

<2>待解决的重复出现的问题和场景

<3>解决方案-描述了组成设计的类和对象的关系,职责以及合作

<4>结论-运用该方案的利弊,主要是对系统弹性,可扩展性和可移植性的影响



4.设计模式的分类

根据其目的(模式是用来做什么的)可分为创建型(Creational),结构型(Structural)和行为型(Behavioral)三种:    

• 创建型模式主要用于创建对象。    

• 结构型模式主要用于处理类或对象的组合。    

• 行为型模式主要用于描述对类或对象怎样交互和怎样分配职责。



创建型模式:  

抽象工厂模式(Abstract Factory)  

建造者模式(Builder)  

工厂方法模式(Factory Method)  

原型模式(Prototype)  

单例模式(Singleton)



结构型模式:  

适配器模式(Adapter)  

桥接模式(Bridge)  

组合模式(Composite)  

装饰模式(Decorator)  

外观模式(Facade)  

享元模式(Flyweight)  

代理模式(Proxy)



行为型模式:  

职责链模式(Chain of Responsibility)  

命令模式(Command)  

解释器模式(Interpreter)  

迭代器模式(Iterator)  

中介者模式(Mediator)  

备忘录模式(Memento)  

观察者模式(Observer)  

状态模式(State)  

策略模式(Strategy)  

模板方法模式(Template Method)  

访问者模式(Visitor)



5.课堂示例-Junit框架用到的设计模式

<1>JUnit在TestCase中应用了模板方法模式:

public void runBare()throws Throwable {   
Throwable exception = null;   
setUp();   
try {     
runTest();   
} catch (Throwable running) {      
exception = running;   
} finally {     
try {       
tearDown();     
} catch (Throwable tearingDown) {       
if (exception == null)          
exception = tearingDown;    
}   
}   
if (exception == null)
return;   
throw exception;
}



<2>JUnit在TestCase类中应用了适配器模式

在runBare()方法中,通过runTest()方法将我们自己编写的testXXX()方法进行了适配,使得JUnit可以执行我们自己编写的TestCase,runTest方法实现如下:

protected void runTest()throws Throwable{    
assertNotNull(this.fName);   
Method runMethod = null;    
try {     
runMethod = super.getClass().getMethod(this.fName, (Class[])null);    
}
catch (NoSuchMethodException e) {     
fail("Method \"" + this.fName + "\" not found");    
}    
if (!(Modifier.isPublic(runMethod.getModifiers()))) {      
("Method \"" + this.fName + "\" should be public"); 
}
try{      
runMethod.invoke(this, (Object[])new Class[0]);    
}
catch (InvocationTargetException e) {     
e.fillInStackTrace();     
throw e.getTargetException();     
}
catch (IllegalAccessException e) {     
e.fillInStackTrace();     
throw e;   
}
}



<3>观察者模式

public interface TestListener {
/**
* An error occurred.
*/
public void addError(Test test, Throwable t);
/**
* A failure occurred.
*/
public void addFailure(Test test, AssertionFailedError t);
/**
* A test ended.
*/
public void endTest(Test test);
/**
* A test started.
*/
public void startTest(Test test);
}



<4>命令模式

经过使用命令模式后的给系统的架构效果:

命令模式将实现请求的一方(TestCase开发)和调用一方(JUnit)进行解耦.

命令模式使新的TestCase很容易加入,无需改变已有的类,只需继承TestCase类即可.

命令模式可以将多个TestCase进行组合成一个复合命令产,TestSuite就是它的一个复合命令,当然它使用了组合模式.

命令模式容易反请求的TestCase组合成请求队列,这样使接收请求的一方(JUnit Framwork),容易决定是否执行请求,一旦发现测试用命失败或者错误可以立该停止进行报告.



<5>策略模式

•Junit Plugin 实现Eclipse plugin接口。

•单元测试类继承TestCase类实现Test接口



<6>组合模式

TestCase(叶子),TestUnite(容器),Test接口(抽象)的底层设计就是典型的组合模式

用户头像

进击的炮灰

关注

还未添加个人签名 2020.05.13 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营-总结3