随笔分类 - 设计模式
摘要:Flyweight模式是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用。也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。FlyweightFactory类一般使用Singleton模式实现。Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度。Flyweight模式的有效性很大程度上取决于如何使用它以及在何处使用它。当以下情况成立时使用Flyweight模式:1 一个应用程序使用了大量的对象。2 完全由于使用大量的对象,造成很大的存储开销。3 对象的大多数状态都可以变为外部状态。4 如果删除对象以外的状态那么可
阅读全文
摘要:桥模式:将抽象部分与它的实现部分相分离,使他们可以独立的变化。package com.qinsoft.design;abstract class Television{ //电视厂商 protected TelevisionMaker televisionMaker; //收看电视 abstract public void teleview(TelevisionMaker televisionMaker);}abstract class TelevisionMaker{ abstract public void produce();}class Inch2...
阅读全文
摘要:装饰模式:动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活。装饰模式可以在不创造更多的子类的模式下,将对象的功能加以扩展。装饰模式与类继承的区别:1) 装饰模式是一种动态行为,对已经存在类进行随意组合,而类的继承是一种静态的行为,一个类定义成什么样的,该类的对象便具有什么样的功能,无法动态的改变。2) 装饰模式扩展的是对象的功能,不需要增加类的数量,而类继承扩展是类的功能,在继承的关系中,如果我们想增加一个对象的功能,我们只能通过继承关系,在子类中增加两个方法。3) 装饰模式是在不改变原类文件和使用继承的情况下,动态的扩展一个对象的功能,它是通过
阅读全文
摘要:适配器模式:将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。• 你想使用一个已经存在的类,而它的接口不符合你的需求。• 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。•(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。类适配器:package com.qinsoft.design;/** * 适配器模式:结构型 */public class Adapter{ public s...
阅读全文
摘要:代理模式:为其他对象提供一种代理以控制对这个对象的访问。所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理。package com.qinsoft.design;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class ProxyClient{ public static void main(St...
阅读全文
摘要:外观模式:为子系统中的一组接口提供一致的界面,fa?ade提供了一高层接口,这个接口使得子系统更容易使用。外观模式定义了一个更高层的接口,使子系统更加容易使用。Facade模式是为了降低子系统之间,客户端与实现化层之间的依赖性。当在构建一个层次化的系统时,也可以同过使用Facade模式定义系统中每一层的入口,从而简化层与层之间的依赖关系。package com.qinsoft.design;public class Facade{ public static void main(String[] args) { //只需要DrawerFacade,不关心子系统之间的依...
阅读全文
摘要:组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性。Composite好处: 1.使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。 2.更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。如何使用Composite? 首先定义一个接口或抽象类,这是设计模式通用方式了,其他设计模式对接口内部定义限制不多,Composite却有个规定,那就是要在接口内部定义一个用于访问和管理Composite组合体的对象们(或称部件C...
阅读全文
摘要:Memento,备忘录模式:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。一、备忘录模式的优点 1、有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,这时,使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。 2、本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需要的这些状态的版本。 3、当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。二、备忘录模式的缺点: 1、如果发起人角色的状态...
阅读全文
摘要:Interpreter,解释器模式:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。package com.qinsoft.design;import java.util.HashMap;abstract class Expression{ //以环境类为准,本方法解释给定的任何一个表达式 public abstract boolean interpret(Content ctx); //检验两个表达式在结构上是否相同 public abstract boolean equals(Object o); /...
阅读全文
摘要:访问者模式:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作。访问者模式的组成结构:1) 访问者角色(Visitor):为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色。这样访问者就可以通过该元素角色的特定接口直接访问它。2) 具体访问者角色(Concrete Visitor):实现每个由访问者角色(Visitor)声明的操作。3) 元素角色(Element):定义一个Accept操作,它以一个访问者为参数。4) 具体元素角色(Concrete Element):实现由元素角
阅读全文
摘要:中介者模式:用一个中介对象封装一些列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。举例:在一个公司里面,有很多部门、员工,为了完成一定的任务,“同事”之间肯定有许多需要互相配合、交流的过程。如果由各个“同事”频繁地到处去与自己有关的“同事”沟通,这样肯定会形成一个多对多的杂乱的联系网络而造成工作效率低下。此时就需要一位专门的“中介者”给各个“同事”分配任务,以及统一跟进大家的进度并在“同事”之间实时地进行交互,保证“同事”之间必须的沟通交流。很明显我们知道此时的“中介者”担任了沟通“同事”彼此之间的重要角色了,“中介者”使得每个“同事”都变
阅读全文
摘要:职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。例如:在大学里面当班干部,时常要向上级申请各方面的东西。譬如申请全班外出秋游,普通同学将申请表交给班长,班长签字之后交给辅导员,辅导员批准之后上交到主任办公室…就是这样,一个请求(这里是一份申请表)有时候需要经过好几个级别的处理者(这里是辅导员、主任)的审查才能够最终被确定可行与否。即不同的处理者对同一个请求可能担负着不同的处理方式、权限,但是我们希望这个请求必须到达最
阅读全文
摘要:策略模式:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。抽象策略角色:通常用一个抽象类或者接口来实现,主要是定义这个算法所完成的功能具体策略角色:包装了相关算法和行为环境角色:持有策略类的引用使用场景:1) 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态的让一个对象在许多行为中选择一种行为。2) 如果系统需要动态地在几种算法中选择一种。那么这些算法可以包装到一个个的具体算法类里面,而这些算法类都是一个抽象算法类的子类。换言之,这些具体算法类均有统一的接口,由于多态性原则。客户端可以选择使用任何一个具.
阅读全文
摘要:状态模式:允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类。1. 策略模式和状态模式是双胞胎,它们有相同的类图,但是它们的意图不同。策略模式是围绕可以互换的算法来成功创建业务的,然而状态模式是通过改变对象内部的状态来帮助对象控制自己的行为.2. Context将与状态相关的操作委托给当前的Concrete State对象处理。3. Context可将自身作为一个参数传递给处理该请求的状态对象。这使得状态对象在必要时可访问Context。4. Context或Concrete State类都可决定哪个状态是另外哪一个的后继者,以及是在何种条件下进行状态转换。也就是说可以在Sta
阅读全文
摘要:命令模式:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作。Command: 定义命令的接口,声明执行的方法。ConcreteCommand: 命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。Receiver: 接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。Invoker: 要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户...
阅读全文
摘要:模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。方法模式的特点:把不变的行为搬到超类,去除子类中重复的代码来体现他的优势。应用场景:需要定义一些顶级逻辑 或者是一个操作中算法的骨架,希望一些步奏的执行推迟到其子类中时 应该考虑模板模式。例如:考虑一个计算存款利息的例子。假设系统需要支持两种存款账号,即货币市场(Money Market)账号和定期存款(Certificate of Deposite)账号。这两种账号的存款利息是不同的,因此,在计算一个存户的存款利息额时,必须区分两种不同
阅读全文
摘要:迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。选用场合:1.访问一个聚合对象的内容而无需暴露它的内部表示。2.支持对聚合对象的多种遍历。3.为遍历不同的聚合结构提供一个统一的接口(即,多态迭代)。迭代器模式由以下角色组成:1)迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。2)具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。3)容器角色(Container):容器角色负责提供创建具体迭代器角色的接口。4)具体容器角色(Concrete Container):具体容器
阅读全文
摘要:创建型设计模式一共有5个:单例模式:Singleton,保证一个类只有一个实例,并提供一个访问它的全局访问点抽象工厂模式:Abstract Factory,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。简单工厂模式:Factory Method,定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。建造者模式:Builder,将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。原型模式:Prototype,用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。简单工厂模式与抽象工
阅读全文
摘要:原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。它主要面对的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。下面我克隆一个类,并修改名字和年龄,看看有什么变化package com.taobao.business;/** * 原型模式:创建型 */public class Prototype{ public static void main(String[] args) throws Exception { //先创建一个对象原型 Person p = n...
阅读全文
摘要:建造者模式:将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。实用范围:1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。 2 当构造过程必须允许被构造的对象有不同表示时。角色:产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。建造者:实现抽象类的所有未...
阅读全文

浙公网安备 33010602011771号