design pattern

桥接模式:
 现需要提供大中小3种型号的画笔,能够绘制5种不同颜色,如果使用蜡笔,我们需要准备3*5=15支蜡笔,也就是说必须准备15个具体的蜡笔类。而如果使用毛笔的话,只需要3种型号的毛笔,外加5个颜料盒,用3+5=8个类就可以实现15支蜡笔的功能。
       实际上,蜡笔和毛笔的关键一个区别就在于笔和颜色是否能够分离。即将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化"。关键就在于能否脱耦。蜡笔的颜色和蜡笔本身是分不开的,所以就造成必须使用15支色彩、大小各异的蜡笔来绘制图画。而毛笔与颜料能够很好的脱耦,各自独立变化,便简化了操作。在这里,抽象层面的概念是:"毛笔用颜料作画",而在实现时,毛笔有大中小三号,颜料有红绿蓝黑白等5种,于是便可出现3×5种组合。

组合:一个公司由多个部门组成,强依赖,公司不在了,部门也就不在了
聚合:一个部门由多个员工组成,弱依赖,部门不在了,但员工还在。
继承与组成相比较的缺点:破坏封装,鸟有吃和飞的抽象方法,但如果让鸭子继承鸟的话 ,鸭子就暴露出飞的接口,这就破坏了鸭子的封装。
                                      子类与父类紧藕合是它的本性,如果设计合理它本来就应该紧耦合的,父类是为子类提供服务,而子类是处理具体的业务


单一职责原则:只有一个变化点。
里氏替换原则:该原则是为了说明什么是好的继承,父类对象在程序中可以很好的工作,换成子类也能很好的工作,如果要达到这种效果,应该:
                      不应该重写父类已实现的方法,可以在子类扩展新方法。
依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
接口隔离原则:一个类对另一个类的依赖应该建立在最小的接口上
迪米特法则:该原则为了类与对象之间的组合,聚合,依赖,关联关系应该尽量做到低耦合, 只与直接的朋友通信
开闭原则:对扩展开放,对修改关闭。


简单工厂
接口的思想:封装隔离,接口将外部调用和内部实现隔离开。
面向接口编程--客户端不需要知道具体实现类,只需知道接口,只需在内部模块再提供一个工厂类,客户只要提供一个标识(可以是数字,也可以是字符串),就能创建一个具体的实现类,并返回一个接口对象。
简单工厂一般提供一个静态或多个静态方法来创建接口,没有必要实例化,所以也叫静态工厂。工厂类也可以缓存具体类,不必每次都创建,具体情况具体分析。
缺点:传入选择具体类参数,说明用户需要知道每个参数的含义及对应的具体功能,这也就意味着向客户暴露了一定的具体内部细节。
简单工厂的本质是选择实现。
框架是能完成一定功能的半成品,而设计模式的重心是 解决方案  ,还停留在思想层面,比框架更抽象。
实现后的简单工厂,客户端只依赖接口和工厂类以及标识参数。

工厂方法
哪类问题的解决方案:
如果工厂类不知道具体创建哪个产品时,可以先写骨架(调用抽象工厂方法返回的新产品接口,执行产品接口的方法),再定义抽象的工厂方法,工厂方法一般不希望被客户端调用(protected),具体实现延迟到工厂子类,和模板方法很象,只是侧重点不同,一个侧重创建对象,一个侧重算法步骤。
IoC/DI 
正常情况是A类需要B类,则可以直接在A类中实例化B类,但如果有了IoC容器,可以解耦,由IoC容器来根据配置来将A的B属性赋值,就是原来由A类控制的实例化转移给了容器,即控制返转,DI依赖注入是控制反转的实现方式叫法,有setter注入,构造注入等等。

依赖倒置原则:高层不要依赖低层,它们都应该依赖接口。


访问者模式

主体元素是一类具有相同接口的类,根据不同的状态或策略会有不同的行为,并且它们的状态或策略是不稳定的。而具体类的数据是稳定的。
不好的实现:
interface Person{public void action();}
class Man implement Person{public void action(){if(status1==true){...}else if(status2==true){...}...}}
class Women implement Person{ public void action(){if(status1==true){...}else if(status2==true){...}...} }
因为状态或策略的数量可能会增加,所以需要相应修改action方法,违背开闭原则。
友好的实现:
interface Person{public void accept();}
class Man implement Person{public void accept(Visitor v){v.visit(this)}}
class Woman implement Person{public void accept(Visitor v){v.visit(this)}}
interface Visitor{ public void visit(Man m); public void visit(Woman w);}
class Status1Visitor implement Visitor{ public void visit(Man m){//status1时man的具体行为} public void visit(Woman w){//status1时woman的具体行为} }
class Status2Visitor implement Visitor{public void visit(Man m){//status2时man的具体行为} public void visit(Woman w){//status2时woman的具体行为}}
将数据与具体行为相分离,并且行为可以符合开闭原则进行扩展
===========================================================================================================
观察者:

实现 Observerable接口的被观察者,被一群实现了 Observer的观察者盯着,如果被观察者有数据变动,会调用notifyall去通知注册在被观察者list里的观察者执行update。

============================================================================================================

猜你喜欢

转载自blog.csdn.net/venlv2046/article/details/80260282