设计模式

 

几个常用的模式

一、创建模式

 

1.  设计模式之Factory(工厂方法和抽象工厂)

    使用工厂模式就象使用new一样频繁.

2.  设计模式之Prototype(原型)

    用原型实例指定创建物件的种类,並且通过拷贝这些原型创建新的物件。

3.  设计模式之Builder
    
     汽车由车轮 方向盘 发动机很多部件组成,同时,将这些部件组装成汽车也是一件複杂的工作,Builder模式就是将这两种情况分开进行。

4.  设计模式之Singleton(单态)

    保證一个类只有一个实例,並提供一个访问它的全局访问点


二、结构模式

1.  设计模式之Facade

     可扩展的使用JDBC针对不同的资料库编程,Facade提供了一种灵活的实现。
 

2.   设计模式之Proxy

     以Jive爲例,剖析代理模式在用户级别授权机制上的应用

3.   设计模式之Adapter

      使用类再生的两个方式:组合(new)和继承(extends),这个已经在"thinking in java"中提到过。

4.   设计模式之Composite

     就是将类用树形结构组合成一个单位。你向别人介绍你是某单位,你是单位元元中的一个元素,别人和你做买卖,相当於和单位做买卖。文章中还对Jive再进行了剖析。

5.    设计模式之Decorator

       Decorator是个油漆工,给你的东东的外表刷上美丽的顔色。

6.    设计模式之Bridge

       将"牛郎织女"分开(本应在一起,分开他们,形成两个介面),在他们之间搭建一个桥(动态的结合)

7.     设计模式之Flyweight

       提供Java运行性能,降低小而大量重复的类的开销。

三、 行爲模式

1.    设计模式之Template

      实际上向你介绍了爲什麽要使用Java 抽象类,该模式原理简单,使用很普遍。

2.    设计模式之Memento

      很简单一个模式,就是在记忆体中保留原来资料的拷贝。

3.    设计模式之Observer

     介绍如何使用Java API提供的现成Observer

4.    设计模式之Chain of Responsibility

     各司其职的类串成一串,好象击鼓传花,当然如果自己能完成,就不要推委给下一个。

5.    设计模式之Command

      什麽是将行爲封装,Command是最好的说明。

6.    设计模式之State

     状态是编程中经常碰到的实例,将状态物件化,设立状态变换器,便可在状态中轻鬆切换。

7.    设计模式之Strategy

     不同演算法各自封装,用户端可随意挑选需要的演算法。

8.    设计模式之Mediator

Mediator很象十字路口的红绿灯,每个车辆只需和红绿灯交互就可以。

9.    设计模式之Interpreter

      主要用来对语言的分析,应用机会不多。

10.   设计模式之Visitor

      访问者在进行访问时,完成一系列实质性操作,而且还可以扩展。

11.    设计模式之Iterator

      这个模式已经被用来遍曆Collection中物件。使用频率很高。在Java中无需专门阐述,在大多数场合也无需自己制造一个Iterator,只要将物件装入Collection中,我们就直接可以使用Iterator模式。

 

12.  回调模式

 

 

 

外观模式

facade实际上是个理顺系统间关系,降低系统间耦合度的一个常用的办法

 

代理模式

  一、Proxy模式定义:

  为其他对象提供一种代理以控制这个对象的访问。又可分为 静态代理动态代理

  二、模式解说

Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层,这个访问层也叫代理。Proxy模式是最常见的模式,在我们生活中处处可见,例如我们买火车票不一定非要到火车站去买,可以到一些火车票的代售点去买。寄信不一定是自己去寄,可以把信委托给邮局,由邮局把信送到目的地,现实生活中还有很多这样的例子,就不一一列举了。

interface GirlInfo{
public void hasBoyFriend();
}


class Girl implements GirlInfo{
public void hasBoyFriend(){
 System.out.println("还没有男朋友");
 }
}


class Proxy implements GirlInfo{
  private GirlInfo _girl;
  public Proxy(GirlInfo girl){
  _girl=girl;
  }
public void hasBoyFriend(){
 _girl.hasBoyFriend();
 
}
}
public class ProxyClient {
  public static void main(String[] args) {
  GirlInfo girl=new Girl();
     Proxy proxy=new Proxy(girl);
     proxy.hasBoyFriend();
}
  
}

从这个例子我们可以看出,Proxy模式是不是和Adapter模式差不多,都是调用一个已有对象的方法来完成功能。但是他们之间还是有区别的,那就是Proxy模式的目标类必须要实现某个接口,代理类没有必要实现该接口,模式是死的,它的实现是活的,如果一味的相信某些书上的实现,学习模式也就失去了意义。有的书上称这种实现为静态代理,之所以这样是为了区别于Proxy模式在jdk中的另一种实现,jdk中的实现称为动态代理。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface GirlInfo{
public void hasBoyFriend();
}

class Girl implements GirlInfo{
  public void hasBoyFriend(){
 System.out.println("还没有男朋友");
 }
}

class GirlProxy implements InvocationHandler{
private Object delegate;
public Object bind(Object delegate){
 this.delegate=delegate;
 return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 method.invoke(delegate, args);
 return null;
}
}

public class ProxyClient {
  public static void main(String[] args) {
 GirlProxy girlProxy=new GirlProxy();
 GirlInfo girl=(GirlInfo)girlProxy.bind(new Girl());
 girl.hasBoyFriend();
}
  
}

 

适配器模式

《设计模式》中说道:将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。

     在实际的生活中有很多例子,如:我们常使用的移动硬盘,无论是笔记本硬盘还是台式机硬盘,对于数据的传输都不使用Usb的数据线,外接的硬盘盒就是将原来的硬盘数据传输方式适合Usb数据线。

适配器模式实现有两种类型:对象适配器、类适配器。上面的代码是对象适配器方式。也就是适配器(Queue)中是使用被适配(ArrayList)的对象实现。

Gof《设计模式》中提到了两种Adapter适配器模式,一种叫对象适配器模式,另一种叫类适配器模式。对象适配器模式的结构如上图,也就是我刚才举的那个例子,那什么是类适配器模式呢?实际上类适配器模式就是让Adapter的实现继承Adaptee。换句话说:类适配器模式是以继承的方式来实现而对象适配器模式是以组合的方式实现。以前我们说过:继承增加了模块间的耦合程度,而组合降低了耦合程度,所以有人建议多使用对象适配器模式,少用类适配器模式。

 

装饰模式

Decorator装饰模式是一种结构型模式,它主要是解决:“过度地使用了继承来扩展对象的功能”,动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

比如: Java I/O API就是使用Decorator 实现的,I/O变种很多,如果想把 BufferStream的额外功能加到 每个stream子类里,采取继承方法,将会产生很多子类,显然相当繁琐.

我们先建立一个接口:

public interface Work
{  public void insert();

}

接口Work有一个具体实现:插入方形桩或圆形桩,这两个区别对Decorator是无所谓.我们以插入方形桩为例:

public class SquarePeg implements Work{
  public void insert(){
    System.out.println("方形桩插入");
  }

}

 

public class RoundPeg implements Work{
  public void insert(){
    System.out.println("圆形桩插入");
  }

}

 

public class Decorator implements Work{

  private Work work;
  public Decorator(Work work){
    this.work=work;
  }

  public void insert(){

    this.work.insert();

newMethod();
  }


  //在新方法中,我们在insert之前增加其他方法,这里次序先后是用户灵活指定的   
  public void newMethod(){
         System.out.println("
额外的花边!");
  }

}

在上例中,我们把挖坑和钉木板都排在了打桩insert前面,这里只是举例说明额外功能次序可以任意安排.

好了,Decorator模式出来了,我们看如何调用:

Work squarePeg = new SquarePeg();

Work roundPeg = new RoundPeg();

Work decorator = new Decorator(squarePeg);
decorator.insert();

或者

Work decorator = new Decorator(roundPeg);
decorator.insert();

Decorator模式至此完成.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值