标签:
本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/blog/4/4-116.html
步骤:
注:三层架构层与层之间使用工厂模式进行解耦;
对工厂也提取接口,增加一个产品时,也相应增加一个生产该产品的实现了工厂接口工厂,避免了增加产品后要对原工厂代码进行修改的问题。
缺点:增加产品也增加了一个工厂,类数量增长较快。
步骤:
A、构造方法私有;
B、在类中构造一个静态私有的唯一实例;
C、提供一个公有的静态方法返回该唯一实例
注:实例化方式有饿汉加载和懒汉加载两种方式,若工厂占用内存较大,考虑用懒汉式提升性能。
单例模式的几种情形:
用于创建复杂类对象,该对象中的模块是固定的,比如各种汉堡,饮料来组合成各种套餐。
步骤:
当一个类创建一个对象的构造方法执行时需要繁琐的数据库操作或者消耗资源的操作时,可以使用原型模式,在创建一个实例之后,后面需要创建的实例直接通过clone进行对象复制。
浅拷贝和深拷贝:
浅拷贝指实例中的基本数据类型进行复制,但是其中的引用类型指向的内存空间不进行拷贝,直接使用Cloneable接口的clone方法即可实现;
深拷贝这是整个实例的整个内存空间全部拷贝,要用ByteArrayOutputStream,ObjectOutputStream,ByteArrayInputStream,ObjectInputStream对原型占用的内存块进行全复制。
步骤:
当一个A类的接口不满足需要用他的B类的接口时,需要一个适配器C来将A类中的数据适配到B类的各个接口中,实现将A类使用到原本不认识他的B类中,比如Android中ListView的适配器。
应用场景:
(1)类的适配器模式:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。
(2)对象的适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行。
(3)接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可。
弊端:适配器模式使用太多会使代码的可维护性降低。
步骤:
缺点:产生过多相似的对象,不易排错!
对一个类的功能加以拓展或者进行访问控制。
步骤:
以上和包装设计模式雷同,为静态代理方式。
动态代理参考Java的动态代理相关技术知识点。
屏蔽调用者和复杂系统之间的交互,在复杂系统外面加一层外观类,在该类中处理好复杂系统的调用关系、调用顺序和依赖关系,只对外面的调用者提供一个简易的调用接口,实际即是封装!
对一个相同接口I的多个不同实现,利用桥接模式来有条不紊地控制对不同实现类的调用。比如JDBC的DriverManager就桥接了多个不同的数据库驱动,在访问不同的数据库之间进行驱动切换不出现错误。
步骤:
处理部分和整体关系,实现将处理简单元素和复杂元素的处理统一性,比如二叉树的数据结构。
步骤:
FlyWeightFactory(维护一个享元单元集合)负责创建和管理享元单元,当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象,加入对象池中。这样就节省了空间,减少了实例的数量。
举例:JDBC连接池。
使用过滤器模式形成类对象的过滤策略。
步骤:
将实现一个抽象类的功能的具体算法写在一个抽象方法中,类内部的执行流程不变,对算法的调用过程不变,再由他的子类来具体实现算法的抽象方法的具体过程,保证了系统内部的逻辑不变,但是可以改变算法策略。(例如Java的事件监听机制)
简单讲即是:一个方法是在一个策略类中实现的,但是调用由执行类去调用。
步骤:
注:系统中可对算法进行多种具体实现,从而在实现过程中可以动态地替换算法策略。
和策略模式类似,只是策略模式的执行类中维护了一个策略接口的引用,通过对这个引用的不同赋值实现策略替换;模板模式指的是执行类就是一个抽象类,定义一个抽象方法,而类中的其他主流程抽象地调用抽象方法来实现自己的功能,接着编写执行类的子类,在子类中才具体实现抽象方法的具体过程(例如JavaIO流中的读写抽象方法)。
简单讲即是:一个方法是在子类中写的,但是调用由父类去调用。
步骤:
注:(1)模板模式延迟了一个类的其中一个具体实现过程,封装了类功能的逻辑流程,将其中的子功能的实现交给子类,实现了子功能的多样化,保证了该类的主流程的不变性和代码重用性。
(2)父类中的主流程方法一般为final。
(3)封装不变部分,拓展可变部分,行为由父类控制,子类实现。
将一个主对象和多个观察者对象关联起来,对主对象进行某些操作时,观察者对象可以收到主对象的执行信息,来进行相关操作。(类似广播操作,Android内容观察者)
步骤:
优点:观察者与被观察者抽象耦合;
缺点:(1)被观察者执行时需要通知多个观察者,影响效率;
(2)观察者和被观察者如果存在互相循环依赖的话,循环调用,堆栈崩溃。
顺序访问集合中的对象,不需要知道集合对象的底层表示。(Java容器的Iterator迭代器)
Iterator迭代器接口一般有的方法:hasNext,next,previous,first
场景:不暴露集合的内部结构,又能对集合进行透明地访问。
事件发出者发出一个事件交给处理者处理,不需要考虑给哪个处理者才能正确处理,各个处理者持有下一个处理者的引用,连成一个处理者责任链,接收到事件时判断当前处理者是否是正确处理者,若是,则进行处理,若不是则交给下一个处理者。
步骤:
优点:发出者和处理者解耦;增删处理者和发出者很方便。
缺点:不一定被接收到;影响性能。
注:链接上的请求可以是一条链,可以是一个树,还可以是一个环,模式本身不约束这个,需要我们自己去实现,同时,在一个时刻,命令只允许由一个对象传给另一个对象,而不允许传给多个对象。
将一个动作的发出者和执行者进行解耦,中间使用命令将发出者和执行者隔开实现解耦。(Struts)
步骤:
优点:降低系统耦合度,分离了发出者和执行者的耦合;
很方便添加命令类和执行者类,便于拓展;
请求和执行分开。
用来保存某个对象的状态,并能在必要的时候恢复这个状态。(游戏存档,事务回滚)
步骤:
核心思想就是:当对象的状态改变时,同时改变其行为。(QQ在线状态)
步骤:
优点:封装转换原则,避免大量的if…else语句;
方便增加新的状态。
访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。访问者模式适用于数据结构相对稳定算法又易变化的系统。因为访问者模式使得算法操作增加变得容易。
步骤:
优点:实现了稳定的数据结构和易变的操作的解耦;
很方便为数据结构添加新的操作,拓展性强。
当系统中有多个对象之间有复杂的关联关系时,每个对象内部都需要维护其他与之关联对象的引用,耦合度太高。使用中介者模式,由中介者维护对象间的引用和对象之间的具体操作流程,当一个对象改变时,只需要维护好该对象和中介者之间的关系即可,不需要考虑和其他关联对象之间的关系。
步骤:
优点:将网状的关系网变成星形关系网,降低代码改变引起的修改代价,增强可维护性;
降低复杂度,各类之间解耦。
用于一些规律性的语言解析,如正则表达式,SQL语句解析。
步骤:
优点:拓展性好,易于实现;
能够简单实现规律性文法的解释。
设计一个表示空null的对象,在各种需要检查空值的地方使用该对象进行使用。
步骤:
优点:统一化了正常对象和空对象的操作方法,并且用户交互信息可以直接封装在空对象中,调用和正常对象相同的方法便可在相应的界面处显示。
本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/blog/4/4-116.html
标签:
原文地址:http://blog.csdn.net/u014394255/article/details/51354819