设计模式 Java
debu阿良
今天的我温柔不了
展开
-
设计模式 十八、职责链模式
职责链模式 Chain of Responsibility :使多个对象都有机会处理请求,从而避免请求的发送者和接收之前的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。好处,接收者和发送者都没有对方的明确信息,且链中对象自己也并不知道链的结构,结果就是职责链可简化对象的互相连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接收者的引用。随时地增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。一个请求极有可能到了链的末端都得不到处理,或者因为没原创 2021-03-12 10:17:17 · 107 阅读 · 2 评论 -
设计模式 十七、命令模式
命令模式 Command:将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化,对请求队列或记录请求日志,以及支持可测性的操作。命令模式第一、能够容易设计一个命令队列;第二、在需要的情况下,可以较容易地将命令融入日志;第三、允许接受请求的一方决定是否要否决请求;第四、可以容易地实现对请求的撤销和重做;第五、由于新加进来的具体命令类不影响其他的类,因此增加新的具体命令类很容易命令模式把请求一个操作的对象与知道怎样执行一个操作的对象分隔开。//命令类,用来声明执行操作的接口abs原创 2021-03-11 16:28:15 · 31 阅读 · 0 评论 -
设计模式 十六、桥接模式
合成/聚合复用原则 CAPR , 尽量使用合成/聚合,尽量不要使用类继承聚合表示一种弱的拥有关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分;合成则是一种强的拥有关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。合成/聚合复用原则的好处是,优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上,这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。桥接模式 Bridge,将抽象部分和他的实现部分分离,使他们都可以独立地变化。并不是说让抽象原创 2021-03-11 16:27:59 · 48 阅读 · 0 评论 -
设计模式 十五、单例模式
单例模式 Singleton ,保证一个类仅有一个实例,并提供一个访问它的全局访问点饿汉式单例在单例类被加载时候,就实例化一个对象并交给自己的引用;而懒汉式单例只有在真正使用的时候才会实例化一个对象并交给自己的引用/**饿汉式单例*我们知道,类加载的方式是按需加载,且加载一次。因此,在上述单例类被加载时,*就会实例化一个对象并交给自己的引用,供系统使用;而且,由于这个类在整个*生命周期中只会被加载一次,因此只会创建一个实例,即能够充分保证单例*/public class Singleton原创 2021-03-11 16:27:37 · 42 阅读 · 0 评论 -
设计模式 十四、迭代器模式
迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部的结构作用用于类型的隐藏内部类可以无限制访问其外部类的成员,包括private成员/**内部类(inner class)*定义:定义在类、方法体、接口中的class*作用*用于类型的隐藏*内部类可以无限制访问其外部类的成员,包括private成员*//*迭代器模式(iterator):对访问动作的抽象底层存放数据的集合:数组(int),私有的,外界不能直接访问通过p原创 2021-03-11 16:27:22 · 38 阅读 · 0 评论 -
设计模式 十三、备忘录模式
备忘录 Memento 模式:在不破坏封装性的前提下,捕获一个对象的内在状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原来的状态。Originator 发起人:负责创建一个备忘录 Memento 用以记录当前时刻它的内部状态,并可以使用备忘录恢复内部状态。Originator 可根据需要决定 Memento 储存 Originator 的哪些内部状态。Memento 备忘录:负责存储 Originator 对象的内部状态, 并可防止 Originator 以外的其他对象访问备忘录原创 2021-03-11 16:27:03 · 43 阅读 · 0 评论 -
设计模式 十二、适配器模式
适配器模式:适配器模式将一个类的接口适配成用户所期待的。一个适配器通常允许因为接口不兼容而不能一起工作的类能够在一起工作,做法是将类自己的接口包裹在一个已存在的类中,分为组合和继承两种形式继承优点:A、Adapter可以重定义Adaptee的部分行为B、不需要额外的指针以间接得到Adaptee继承缺点:当想要匹配另一个类及其所有子类时,类Adapter将无法实现。组合优点:一个Adapter可以与多个Adaptee及其所有子类同时工作组合缺点:不能重定义Adaptee的行为适配器模式使原创 2021-03-11 16:26:46 · 39 阅读 · 0 评论 -
设计模式 十一、状态模式
状态模式 State ,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑化。//状态抽象类,定义一个接口以及封装与Context 的一个特定状态相关的行为public abstract class State { public abstract void Handle(Context context);}//Context原创 2021-03-11 16:26:27 · 42 阅读 · 0 评论 -
设计模式 十、观察者模式
观察者模式原理:又叫发布/订阅模式,定义一种一对多的依赖,让多个观察者同时监听某个主题对象,当该主题对象发生状态变化时,通知所有已注册的观察者,使他们能够自动更新自己例子Subject:抽象主题,它把所有对观察者的对象引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供接口(attach、detach、notify),可以增加和删除,通知观察者对象。Observer:抽象观察者,为所有的具体观察者类定义一个接口,在得到主题的通知时更新自己。在Subject状态发生变化时,notif原创 2021-03-11 16:25:21 · 91 阅读 · 0 评论 -
设计模式 九、建造者模式
建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。用户只需指定需要构建的类型就可以得到它们,而具体构建的过程和细节就不需要知道。建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方案时适用。//抽象建造者public interface Builder { public void BuilderPartA(); public void BuilderPartB(); public Product GetResul原创 2021-03-11 16:25:01 · 42 阅读 · 0 评论 -
设计模式 八、外观模式
外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。依赖倒转原则:抽象不应该依赖细节,细节应该依赖于抽象。针对接口编程,不要对实现编程。A.高层模块不应该依赖底层模块,两个都应该依赖抽象。B.抽象不应该依赖细节,细节应该依赖抽象。迪米特法则:如果两个类之间不必彼此通信,那么这两个类就不应该发送直接的相互作用。如果其中一个类需要调用另一个类的某一个方法,可以通过第三者转发这个调用。外观模式完美地体现了依赖倒转原则和迪米特法则的思想。p原创 2021-03-11 16:24:38 · 44 阅读 · 0 评论 -
设计模式 七、模板方法模式
模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法通过把不变行为搬移到超类,去除子类的重复代码,提供了很好的代码复用平台。public abstract class TestPaper { public abstract void Answer1(); //抽象行为,放到子类去实现 public abstract void Answer2(); public void Test1(原创 2021-03-10 10:33:26 · 47 阅读 · 0 评论 -
设计模式 六、原型模式
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。浅复制,深复制浅复制,复制值类型的实域,对引用类型的实域只复制引用不复制引用的对象,即克隆出来的对象b和原对象a引用同一个对象类型的实域c,在 b的方法 改变 b中的c 会影响 a中的c。//简历类,实现Cloneable接口public class Resume implements Cloneable { private String原创 2021-03-10 10:32:47 · 48 阅读 · 0 评论 -
设计模式 五、工厂模式
工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类,克服了简单工厂违背开放——封闭原则的缺点,又保持了封装对象创建过程的有点。开放——封闭原则:对于拓展是开放的,对于更改是封闭的学生和志愿者继承雷锋类,学生工厂和志愿者工厂实现了雷锋工厂接口,当需要改变实例化的对象时,只需要更改工厂就行了。而在添加新的类时,只需要添加新的工厂,无需更改原有类的代码//雷锋public class LeiFeng { public void wash() {原创 2021-03-10 10:32:05 · 50 阅读 · 0 评论 -
设计模式 四、代理模式
代理模式,为其他对象提供一种代理以控制对这个对象的访问。静态代理:委托者和代理者实现同一个接口,委托者持有代理者的实例,在代理任务的过程中可以做些其他事情,比如远程代理:为一个对象在不同的地址空间提供局部代表,隐藏一个对象存在不同地址空间的事实。虚拟代理,根据需要创建开销很大的对象, 通过它来存放实例化需要很长时间的真实对象。如打开网页时未加载的图片,此时代理存储了真实图片的路径和尺寸。安全代理,用来控制真实对象访问的权限。智能指引,代理处理另外一些事。如计算真实对象的引用次数,无引用时释放对象原创 2021-03-10 10:31:28 · 76 阅读 · 0 评论 -
设计模式 三、装饰器模式
装饰器模式,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活。它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码可以在运行时根据需要有选择地,有根据地使用装饰功能包装对象。//被装饰对象基类public interface Compent { public void operation();}//具体被装饰对象public class RealCompent implements Compent {原创 2021-03-10 10:30:32 · 48 阅读 · 0 评论 -
设计模式 二、策略模式
策略模式是一种定义一系列算法的方法,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。策略模式是用来封装算法的,在实践中,可以用来封装几乎任何类型的变化。在超市现金收费算法中,有正常收费,满300-100,打8折等多种收费方式,把收费算法 CashSuper 看成抽象策略。各种收费方式看成具体的策略类,继承 CashSuper 抽象基类其中 CashContext 用来创造具体策略类的实例,调用其具体的策略算法。在 CashC原创 2021-03-10 10:30:02 · 62 阅读 · 0 评论 -
设计模式 一、简单工厂模式
运用一个单独的 OperationFactory 类,来做创造 Operation 运算符 实例的过程,便是简单工厂模式。其中加减乘除运算符都是运用了面向对象的继承特性,需要添加开方或者sin函数运算只需要多继承一个而不需要改动原有的代码,更改其中一个只需在本身的类里更改。封装特性体现在运算类与客户端的界面显示分离也可用接口实现,更为灵活,这里主要体现简单工厂模式的用法//运算符基类public class Operation { protected double _numA; p原创 2021-03-10 10:28:28 · 101 阅读 · 0 评论