设计模式初步理解


>>>>>设计模式
|-创建型
|-工厂方法
|-概念
|-定义一个用于创建对象的接口,让子类决定实例化哪一个类。
|-例如工厂提供了用钢铁进行创建的方法,但具体要用之创建汽车或者手枪都是看子类的具体实现来决定的。
|-适用
|-不明创建类型 | 希望子类指定创建类型 | 创建对象职责委托给子类
|-实例
|-Product:定义工厂方法所创建对象的接口
|- interface Work - void doWork();
|-ConcreteProduct:实现Product接口
|- class StudentWork implements Work - void doWork() 
|- class TeacherWork implements Work - void doWork()
|-Creator:声明工厂方法,返回Product类型对象 
|- interface IWorkFactory - Work getWork
|-ConcreteCreator:重定义工厂方法并返回一个ConcreteCreator实例
|- class StudentWorkFactory implements IWorkFactory - Work getWork
|- class TeacherWorkFactory implements IWorkFactory - Work getWork() 
|-抽象工厂
|-概念
|-提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
|-适用
|-系统独立于产品进行创建、组合和表示 | 系统由多个产品系列的一个来配置 | 强调系列产品设计的联合使用 | 体现产品类库的接口而非实现
|-实例
|-AbstractFactory:  声明一个创建抽象产品对象的操作接口
|-interface IAnimalFactory - ICat createCat& IDog createDog
|-ConcreteFactory: 实现创建具体产品对象的操作
|-class BlackAnimalFactory implements IAnimalFactory - return new BlackDog/Cat();
|-class WhiteAnimalFactory implements IAnimalFactory - return new WhiteDog/Cat();
|-AbstractProduct: 为一类产品对象声明一个接口
|-interface ICat - void eat();
|-interface IDog - void eat();
|-ConcreteProduct: 定义一个将被相应的具体工厂创建的产品对象, 实现AbstractProduct接口
|-class BlackCat implements ICat 
|-class WhiteCat implements ICat 
|-class BlackDog implements IDog 
|-class WhiteDog implements IDog 
|-Client: 仅使用由AbstractFactory和AbstractProduct类声明的接口
|-建造者模式
|-概念
|-将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
|-游戏= 玩法+ 图形绘制(接口), 其中图形绘制.画墙,根据不同情景会实现不同的图形代入,那么传入不同的绘制方式便实现了定义与实现的分离
|-适用
|-构造时允许构造有不同表示 | 复杂对象算法独立于部件及其装配方式
|-实例
|-
|-单例模式
|-概念
|-保证一个类仅有一个实例,并提供一个访问它的全局访问点
|-适用
|-仅一实例且有五彩纷呈访问结点 | 唯一实例可由子类化可扩展
|-实例
|-
|-原型模式
|-概念
|-重构父类的Clone,进行文件复制
|-适用
|-当要实例化的类是在运行时刻指定时 | 建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些
|-实例
|-
|-结构型
|-适配器模式
|-概念
|-将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
|-设置外部属性进行外部设置,从而让调用人通过该参数调用来实施指定方法
|-适用
|-已实现,但目前接口不适合的情况 | 进行类之间的协同工作
|-实例
|-
|-桥接模式
|-概念
|-将抽象部份与它的实现部份分离,使它们都可以独立地变化。
|-适用
|-程序运行时动态选择切换 | 类的抽象实现可由子类生成方法来扩充 | 抽象的修改不影响客户端
|-实例
|-
|-组合模式
|-概念
|-将对象组合成树形结构以表示"部分-整体"的层次结构
|-其实就是像人这个类中存有一个列表,用于存放他管辖的人,这样层层关系就构成了树
|-适用
|-表示对象的部分-整体层次结构 | 希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象
|-实例
|-
|-装饰模式
|-概念
|-动态地给一个对象添加一些额外的职责
|-适用
|-在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责 | 当不能采用生成子类的方法进行扩充时
|-实例
|- interface Basic
class One implements Basic
class Two implements Basic{
private Basic basic;
public void Two(Basic basic){this.basic= basic;}
}
--> Two two= new Two(new One());
|-外观模式
|-概念
|-为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
|-比如A、B服务一定要A先执行完成后B才能进行,但外部人员可能不清楚,这时候就能将具体的实现封装起来,方便子系统进行调用
|-适用
|-为复杂子系统提供简单接口 | 客户端与抽象类实现的依赖
|-实例
|-
|-享元模式
|-概念
|-运用共享技术有效地支持大量细粒度的对象
|-其实就是进行数据的重复利用,如同“XX”的数组字符串,JVM其实是将进行同一不可修改字符串的赋值
|-适用
|-用大量的对象 | 对象的大多数状态都可变为外部状态
|-实例
|-
|-代理模式
|-概念
|-为其他对象提供一种代理以控制对这个对象的访问
|-其实就是在另一个类中进行对一个指定类的调用等,然后在方法中加上执行前后需要的步骤
|-适用
|-
|-实例
|-
|-行为型
|-责任链模式
|-概念
|-使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链 并沿着这条链传递该请求,直到有一个对象处理它为止
|-其实就是对象内部有一个自身对象,以链表方式实现
|-适用
|-需要对象逐一处理 | 处理一个请求的对象集合就被动态指定
|-实例
|-
|-命令模式
|-概念
|-将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
|-命令格式接口,然后进行不同实现方式的继承,而在实现过程中由于不同继承对象的使用,实现了不同的命令
|-适用
|-用构建在原语操作上的高层操作构造一个系统 | 抽象出待执行的动作以参数化某对象
|-实例
|-
|-解释器模式
|-概念
|-给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子
|-适用
|-当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式
|-实例
|-
|-迭代器模式
|-概念
|-自定义封装元件的迭代模式,使用固定的循环访问方法进行查询
|-适用
|-访问一个聚合对象的内容而无需暴露它的内部表示 | 持对聚合对象的多种遍历 | 支持多态迭代
|-实例
|-
|-中介模式
|-概念
|-用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
|-对应对象的动作是由于别人的通知才产生的,这就需要在中介中注册用户信息,然后指定情况发生后通知并让其进行对应事件
|-适用
|-一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。 | 定制一个分布在多个类中的行为,而又不想生成太多的子类
|-实例
|-
|-备忘录模式
|-概念
|-在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
|-其实就是将一个影响业务体现的一些重要参数封装为一个类,比如在开始的时候将状态保存为一个对象,然后再到合适的时候还原回去,进行状态重置
|-适用
|-保存状态并于需要时回复 
|-实例
|-
|-观察者模式
|-概念
|-定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
|-其实也就是一个类中放另一个类的对象集合,然后在指定事件发生后逐一通知
|-适用
|-当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变
|-实例
|-
|-状态模式
|-概念
|-定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
|-适用
|-一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为
|-实例
|-
|-策略模式
|-概念
|-定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
|-适用
|-使用一个算法的不同变体 | 算法使用客户不应该知道的数据,避免暴露与算法相关的数据结构
|-实例
|- public void replace() { 
  switch(getChangeType()) { 
     case RN_TYPE:   replaceRN(); 
                         break; 
     case N_TYPE: replaceN(); 
                         break; 
     case OTHER_TYPE: replaceOTHER(): 
                         break; 
     ... 
  } 
}
* getChangeType()在此例中就是不同的类
* 而选择什么类来实现则就是Switch
* 而各类中遵循生成的replace()就是对应switch的实现
|-模板方法
|-概念
|-定义一个操作中的算法的骨架,而将一些步骤延迟到子类中
|-适用
|-一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现(其实这就是抽象类)
|-实例
|-
|-访问者模式
|-概念
|-表示一个作用于某对象结构中的各元素的操作,使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作
|-从物件自身的角度来想好了,物件在一个个的房子中,物件说:“不要在房子外费尽心思判断了,即然您不知道我是谁,那么您就进来访问我好了,我告诉您我是谁,这么一来您就知道如何操作我了!”
|-适用
|-
|-实例
|-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值