架构师第三周总结

发布于: 1 小时前

一、设计模式的定义

设计模式 是指在特定环境下为解决某一通用软件设计问题提供的一套定制的解决方案,该解决方案描述了对象和类之间的相互作用。

设计模式包含四个部分:模式的名称、待解决问题、方案、结论。

 

二、设计模式的分类

(一)创建型

抽象工厂模式(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)

三、设计模式应用

(一)JUnit中模板方法模式

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

public void runBare() throws Throwable{    

setUp();    

try{      

 runTest();    

}finally{      

 tearDown();  

 }

}

(二)JUnit中的组合模式:

//composite模式中的Component角色

public interface Test {

public abstract void run(TestResult result);

}

//composite模式中的Leaf角色

public abstract class TestCase extends Assert implements Test {

public void run(TestResult result) {

result.run(this);

}

}

// composite模式中的composite角色

public class TestSuite implements Test {

private Vector fTests= new Vector(10);

public void addTest(Test test) {

fTests.addElement(test);

}

public Enumeration tests() {

return fTests.elements();

}

public void run(TestResult result) {

for (Enumeration e= tests(); e.hasMoreElements(); ) {

Test test= (Test)e.nextElement();

runTest(test, result);

}

}

public void addTestSuite(Class testClass) {

addTest(new TestSuite(testClass));

}

}

(三)servlet中的模板方法模式

HttpServlet类提供了一个service()方法,这个方法调用七个do方法中的一个或几个,完成对客户端调用的响应。这些do方法需要由HttpServlet的具体子类提供,因此这是典型的模板方法模式。下面是service()方法的源代码。

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

……………………………………………

if (method.equals("GET")) {

…………………………………………

this.doGet(req, resp);

} else {

long ifModifiedSince = req.getDateHeader("If-Modified-Since");

if (ifModifiedSince < lastModified) {

this.maybeSetLastModified(resp, lastModified);

this.doGet(req, resp);

} else {

resp.setStatus(304);

}

}

} else if (method.equals("HEAD")) {

…………………………………………………..

this.doHead(req, resp);

} else if (method.equals("POST")) {

this.doPost(req, resp);

} else if (method.equals("PUT")) {

this.doPut(req, resp);

} else if (method.equals("DELETE")) {

this.doDelete(req, resp);

} else if (method.equals("OPTIONS")) {

this.doOptions(req, resp);

} else if (method.equals("TRACE")) {

this.doTrace(req, resp);

} else {

…………………………………………………………….

}

}

(四)Spring中的单例模式

private final Map singletonObjects =new HashMap();

protected Object getSingleton(String beanName) {

Object singletonObject = this.singletonObjects.get(beanName);//检查缓存中是否存在实例

if (singletonObject == null) {

synchronized (this.singletonObjects) {//如果为空则锁定全局变量进行处理

singletonObject = singletonFactory.getObject(); //调用工厂方法获取实例

this.earlySingletonObjects.put(beanName, singletonObject); //记录在缓存中

}

}

return (singletonObject != NULL_OBJECT ? singletonObject : null);

}

(五)java io中的装饰器模式

Java的io中FileInputStream,它的read方法并没有缓冲功能,通过BufferedInputStream来装饰它,那么每次调用read就有了缓冲功能。如以下代码所示:

//FileInputStream以构造函数参数的方式传入BufferedInputStream,BufferedInputStream对其进行装饰

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("demo.txt")));

四、设计模式总结

学习设计模式,不是为了死记硬背23种设计模式,而是要体会设计模式的设计思想,让代码达到“低耦合、高内聚”的目标,让我们的代码更易于扩展和维护,当我们真正能够融会贯通这种思想的时候,其实记不记得住23中设计模式不重要了,只要我们的代码是“低耦合、高内聚”的,那么我们学习设计模式的目的就达到了。

用户头像

小蚂蚁

关注

还未添加个人签名 2018.08.10 加入

还未添加个人简介

评论

发布
暂无评论
架构师第三周总结