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、显卡等配件,都是作为同事对象。

  • 相关阅读:
    一行代码更改博客园皮肤
    fatal: refusing to merge unrelated histories
    使用 netcat 传输大文件
    linux 命令后台运行
    .net core 使用 Nlog 配置文件
    .net core 使用 Nlog 集成 exceptionless 配置文件
    Mysql不同字符串格式的连表查询
    Mongodb between 时间范围
    VS Code 使用 Debugger for Chrome 调试vue
    css权重说明
  • 原文地址:https://www.cnblogs.com/lifeone/p/7269526.html
Copyright © 2011-2022 走看看