首页 > 代码库 > 设计模式-01

设计模式-01

1 接口设计模式

  适用于:需要对一个类或一组类的方法进行定义或重定义的场景

package com.beifeng.hadoop.pattern.interfacee;
/**
 * @Description 接口定义
 */
public interface IPersonService {
    String getName();
    void sayHello();
}
package com.beifeng.hadoop.pattern.interfacee;
/**
 * @Description 接口实现类
 */
public class PersonServiceImpl implements IPersonService {
    public String getName() {
        return this.getClass().getName();
    }
    public void sayHello() {
        System.out.println("hello "+getName());
    }
}

2 适配器模式(adapter)

  设计目标:使用不同接口的类所提供的服务为客户端提供它所期望的接口
  使用场景:如果客户端已经提供了接口和实现类,但不能满足需要时,自定义一个新的类继承原实现类并实现接口
  2.2 分类:
     类适配器:新的适配器类实现需要的接口,并继承现有的类
    对象适配器(没有接口的情况):继承实现类,并在内部引用现有类, 如果适配类需要从多个对象中获取信息,通常也使用对象适配器

package com.beifeng.hadoop.pattern.adapter;
import com.beifeng.hadoop.pattern.interfacee.PersonServiceImpl;
/**
 * @Description 客户端实现类
 */
public class ClientPerServiceImpl extends PersonServiceImpl{ 
}
package com.beifeng.hadoop.pattern.adapter;
import com.beifeng.hadoop.pattern.interfacee.IPersonService;
/**
 * @Description 类适配器:继承现有实现类并实现接口
 */
public class ClassPersonServeiceImpl extends ClientPerServiceImpl
        implements IPersonService {
    public void showClient() {
        System.out.println("client is "+System.getProperty("os.name"));
    }
}
package com.beifeng.hadoop.pattern.adapter;
import com.beifeng.hadoop.pattern.interfacee.PersonServiceImpl;
/**
 * @Description 对象适配器:假如没有接口提供
 */
public class ObjectPersonServiceImpl extends PersonServiceImpl {
    private ClientPerServiceImpl clientPerServiceImpl;
    public ObjectPersonServiceImpl(ClientPerServiceImpl clientPerServiceImpl) {
        super();
        this.clientPerServiceImpl = clientPerServiceImpl;
    }
    @Override
    public String getName() {
        return clientPerServiceImpl.getName();
    }
    @Override
    public void sayHello() {
        System.out.println("client is "+System.getProperty("os.name"));
        clientPerServiceImpl.sayHello();
    }  
}

3 外观模式 (facade)

  目标:简化工具包的使用,为子系统提供一个接口,便于使用
  实例程序:可以独立运行,却无法重用,仅用于演示使用子系统的方法
  外观类:可配置,可重用类,提供了高层次的接口,使得子系统使用更加方便。

4 合成模式(composite):一组对象的组合

  目标:为了保证客户端调用但对象和组合对象的一致性

  两个特征:

    1) 组对象允许包含单对象,也可以包含其他的组对象

    2 )  组合对象和单对象定义共同的行为

5 桥接模式(bridge)

  使用场景:某个类具有两个或两个以上的维度变化,如果只使用继承设计将会很臃肿,可以将继承关系改为耦合关系

6 观察者模式(observer)

  目标:在多个对象之间定义一对多的依赖关系,当一个对象的状态发生改变时,会通知依赖他的对象,并根据新状态做出相应的反应。

  实现步骤:被观察者中添加观察者列表,当被观察者发生变化时,调用方法,通知观察者列表中的所用观察者的方法

   主题接口(被观察者接口)的 3个基本操作:注册新的观察者,通知所有观察者更新数据,移除取消观察的观察者对象

/**主题接口:被观察者 3个基本操作:注册新的观察者,通知所有观察者更新数据,移除取消观察的观察者对象*/
public interface Subject {
    //注册观察者
    void registerObserver(Observer observer);
    //移除取消观察的观察者对象
    void removeOberver(Observer observer);
    //通知所用观察者
    void notifyObervers();
}
/**被观察者实现类,气象站 */
public class WeatherData implements Subject {
    //观察者列表
    private ArrayList<Observer> observers;
    private float temperature;//温度
    public WeatherData() {
        observers=new ArrayList<Observer>();
    }
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }
    public void removeOberver(Observer observer) {
        int i=observers.indexOf(observer);
        if (i!=-1) {
            observers.remove(i);
        }
    }
    public void notifyObervers() {
        if (observers!=null&&observers.size()>0) {
            for(Observer observer:observers){
                observer.update(temperature);
            }
        }
    }
    public float getTemperature() {
        return temperature;
    }
    public void setTemperature(float temperature) {
        this.temperature = temperature;
        notifyObervers();
    }
}

7 调停者模式(mediator)

  设计目标:定义一个对象,封装一组对象的交互,从而降低对象间的耦合度,避免对象间的显示引用,而且可以独立地改变对象的行为。

  适用场景:多个对象彼此互相作用,可以创建一个中间对象,让该对象持有多个对象的引用,而多个对象持有中间对象的引用,此时,

        多个对象都称为同事对象,而中间对象称为调停者对象,当同事对象发生变化时可以,对用调停者对象通知要影响的同事对象

  实例:使用电脑来看电影

    在日常生活中,我们经常使用电脑来看电影,把这个过程描述出来,简化后假定会有如下的交互过程:

    (1)首先是光驱要读取光盘上的数据,然后告诉主板,它的状态改变了。

    (2)主板去得到光驱的数据,把这些数据交给CPU进行分析处理。

    (3)CPU处理完后,把数据分成了视频数据和音频数据,通知主板,它处理完了。

    (4)主板去得到CPU处理过后的数据,分别把数据交给显卡和声卡,去显示出视频和发出声音。

    要使用调停者模式来实现示例,那就要区分出同事对象和调停者对象。很明显,主板是调停者,而光驱、声卡、CPU、显卡等配件,都是作为同事对象。

设计模式-01