`
luzl
  • 浏览: 563352 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

设计模式--琢磨推敲

    博客分类:
  • Java
阅读更多
分类:
  创建模式
  结构模式
  行为模式

尤点:
  面向界面(client更易于操作)
  降低耦合度(维护更加容易,修改部分代码不需要修改全部相关代码)
  增加灵活度(client调用灵活,修改代码,维护代码灵活)

详细点:
  创建模式
  简单工厂模式:
  使用工厂类将客户和客户所请求的类分开,这样客户只需要像工厂类请求就可以了。
 
  该模式的缺点是如果新增加被消费类(被请求类)的话,需要修改工厂类。但是如果你能确定被消费类的参数的话,可以借助一些配置解决这个缺陷,把类名和参数类型配置到数据库或者XML文件中,使用反射生成被消费类。
  
  工厂方法模式(抽象工厂模式):
  不负责创建具体的被消费类,而是仅仅指出工厂类需要实现那些方法,所以它是针对工厂模式的抽象设计。

  Builder模式
  假设你倒一杯水分为以下几步:1.选择杯子(大杯,还是小杯),2.加入饮料(白开水,可乐,果汁).
  你可以把这两个步骤抽象为一个接口:builderDrinking,然后你可以生成几个类:白开水类,可乐类,果汁类,分别实现这个接口的这两个步骤。为了给client统一接口,再写一个Direct类,这个类接受实现builderDrinking这个接口的类,并且进行组装:
 public interface BuilderDrinking{
   public void chooseCup();
   public void fillIn();
  }
  
  public class plainWater implemets BuilderDrinking{
   public vlid chooseCup(){
      System.out.println("Choose cup");
   }

   public void fillIn(){
      System.out.println("fill cup");
   }
  }
 
  public class Director(){
     private BuilderDrinking builder=null;

     public Director(BuilderDrinking builder){
          builder=builder;
     }
     
     
     public void getDrinking(){
        this.builder.ChooseCup();
        this.builder.fillIn();
     }
  }


  原型模式(prototype)
  原型模式的意思是创建一个包括所有常用信息的类,然后让这个类实现克隆接口,当你要使用这些信息时,只需要克隆一下就行了。
 
  单例(Singleton)
  为了确保一个类在整个application中只有一个实例,那么就要实现单态(SingleTon),大概就是定义一个私有成员变量,类型是类本身,然后定义个getInstance方法,由该方法返回这个成员变量,给这个成员变量赋值有两种形式,一种是在定义的时候直接赋值,另外一种是在getInstance方法做一个判断,如果该变量为null则赋值,当然,我们这里所赋得值是:new SingleTon()--这里假设你定义的单态类名字是SingleTon.
  
  
  结构模式
  适配器模式(Adapter)
  两个类(一般来说没有源代码,意思是我们不能修改源代码)没有统一接口,但是需要通信,这时候就需要用到适配器,适配器能够对传递的参数和返回的参数做适当的处理,使得通信能够进行,这个是为了能够增加耦合。

  桥接模式(Bridge)
  为了降低耦合度,将抽象和实现分离,使得他们能够独立的变化.在软件工程中抽象和实现使用组合和聚合而不是继承,使得两者能够独立的变化.

  合成模式(composite)
  将对象组织到树型结构中,以树的结构来表现整体和部分的关系.合成模式就是处理树形结构对象的模式。合成模式将部分与整体的关系用树形结构表现出来。
  合成模式将一个个单独的成员对象和由他们组合而成的合成对象同等看待。


  装饰模式(Decorator)
  以对客户透明的方式扩展对象功能,是继承关系的替代方案,比继承更加灵活,可以动态增加一些功能也可以动态撤销,增加由一些基本功能排列组合而成非常大量的功能。


  门面模式(Facade)
  外部系统与一个子系统的通信必须通过一个统一的门面对象进行,门面模式提供一个高层次的接口,使得子系统更易于使用。每个子系统只能有一个门面类,而且此门面只能有一个实例,所以它应该是单态,但是一个系统可以有多个门面类。

  享元模式(FlyWeight)
  FlyWeight是拳击比赛中的名词,指的是最轻量级选手,它所要解决的问题是减少系统中创建的实例(使用cache技术)从而减少内存的使用。它以共享的方式高效的支持大量的细粒度对象。
    它能做到共享的关键是区分内蕴状态和外蕴状态,内蕴状态存在享元内不会随着环境的变化而变化,外蕴状态随环境的改变而改变。外蕴状态不会影响内蕴状态,他们之间相互独立。
   将可以共享的状态和不可以共享的状态从常规类中区分开来,去掉不可以共享的状态。这样就形成了共享元类。
   客户端不可以直接创建被共享的对象,而是由工厂对象负责创建。

  代理模式(Proxy)
  代理就是一个人或一个机构代理另外一个人或机构采取行动。
  创建一个对象来操作另外一个对象,这个对象就叫做被代理对象的代理对象,这种设计模式就叫做代理模式。
  有些情况下客户不允许或者不想直接引用目标对象(降低耦合度,有改动只需要改动proxy就可以了),代理对象可以起到中介作用。
  客户端分辨不出代理主题对象和真实主题对象。
  代理对象可以不知道被代理对象,而是仅仅知道一个被代理对象的接口,这时候代理对象不能够直接创建被代理对象,被代理对象必须由系统的其他角色创建并代为传入。(你只能访问接口,说明权限小嘛,当然不能创建被代理对象了,如果能创建被代理对象,怎么能够只能访问接口呢?)

  行为模式
  责任链模式(Chain Of Responsibility)
  每个对象都有一个对其它对象的引用,这样就形成了一个对象链。请求在这个链上传递,直到某一个对象对它进行处理。
  客户并不知道是那个对象处理了它的请求,所以系统可以在不影响客户的情况下重新组织链和分配责任。
  处理者有两个选择处理或者传把请求传递给它所引用的其他对象,一个请求可以不被任何对象处理。

  解释器模式(Interpreter)
  给定一种语言后,解释器可以给出其文法的一种表示,并且提供一种解释器.
  客户端可以使用解释器来解释该语言中的句子.
  解释器模式将描述在有了一个简单的文法后,使用模式设计解释这些句子.
  解释器模式提到的语言是任何解释器对象能够解释的任何组合.
  在解释器模式中需要定义一个代表文法的命令类的等级结构,也就是组合规则.
  每个命令都有一个解释方法,代表对命令对象的解释.
  等级结构中命令对象的任何组合都是一种语言.

  迭代模式(Iterator)
  多个对象聚在一起形成的对象叫做聚集,聚集对象是包括一组对象的容器对象。
  迭代模式能够顺序访问聚集中的对象而不暴露聚集的内部表象。
  迭代模式将迭代对象封装到一个独立的子对象中,从而与聚集本身隔离。
  迭代模式简化了聚集的界面,每一个聚集对象都可以有一个或一个以上的迭代对象,每个迭代对象的状态是彼此独立的,迭代算法可以独立于聚集角色而变化(即不同的聚集对象有不同的迭代算法)

  调停模式(Mediator)
  封装了一系列对象相互作用的方式,使得这些对象不能直接相互作用。从而实现松散耦合,当某些对象间的相互作用发生改变时不会立即影响其他对象间的相互作用。以保证这些对象间能够独立变化。调停模式将多对多的相互作用转换为一对多的相互作用。
  适配器(Adapter)模式主要是为了能够使两者能够通信,因为他们之间的参数接受传递不统一。调停模式解决的问题是降低各个对象间相互作用的耦合度,使得他们能够独立变化。关系也比适配器模式复杂是一对多和多对一。

  备忘录模式(memento)
  备忘录对象是一个用来存储另外一个对象的内部状态快照的对象。
  备忘录模式的用意是在不破坏封装的前提下捕获对象的状态并外部化,存储起来,从而在适当的时候可以将这个对象恢复到存储起来的状态。

  观察者模式(Observer)
  观察者模式定义了一对多的依赖关系,让多个观察者对象同时监听某一主题对象。当这一主题对象的状态发生改变时会自动通知其他观察者对象,让他们自动更新自己。

  状态模式(state)
  不同的状态,不同的行为。
  将行为包装在不同的状态对象类里面,为每个状态创建不同的子类,当状态改变时便选择不同的子类。
 
  策略模式(Strategy)
  策略模式针对一组算法或者行为定义一个借口,然后各种算法或者行为由不同的类实现,这样他们可以相互替换。它使得算法或者行为能够在不影响客户端的情况下发生变化。
  策略把环境和行为分开,环境类负责查询和维护策略类,各种算法或者行为在策略类中提供。
  由于策略和环境分开,使得算法的改变不会影响环境和客户端。

  模板模式(Template)
  模板模式准备一个抽象类,将部分逻辑以具体方法及构造体的形式实现,然后申明一些抽象方法,迫使子类实现剩余的逻辑。不同的子类对抽象方法有不同的实现,从而使得剩余的逻辑有不同的实现。
  首先定义一个顶级框架,将细节交给子类去实现。
 
  访问者模式(Visitor)
  访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话接受这些操作的数据结构不需要改变。访问者模式适用于数据结构相对不稳定的系统,它把数据结构和作用于数据结构上的耦合解脱开。
  访问者模式使得新增加操作变得很容易,就是新增加访问者类。
  访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个节点类中。
  当适用访问者模式时,要将尽可能多的对象浏览逻辑放到访问者类中,而不是放到它的子类中。
  访问者模式可以跨过几个类的等级结构访问属于不同等级结构成员类。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics