zoukankan      html  css  js  c++  java
  • 设计模式-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、显卡等配件,都是作为同事对象。

  • 相关阅读:
    仅此一文让你明白ASP.NET MVC 之View的显示
    仅此一文让你明白ASP.NET MVC原理
    MVC4相关Razor语法以及Form表单
    关于jQuery UI 使用心得及技巧
    jQuery编程的最佳实践
    前端不为人知的一面--前端冷知识集锦
    jQuery插件开发精品教程,让你的jQuery提升一个台阶
    常用数据结构及复杂度
    初探12306售票算法
    ajax省市县三级联动
  • 原文地址:https://www.cnblogs.com/lifeone/p/7269526.html
Copyright © 2011-2022 走看看