美文网首页
设计模式

设计模式

作者: 大盗海洲 | 来源:发表于2019-06-13 21:36 被阅读0次

简单工厂模式

  • 使用场景:
    1、 工厂类负责创建的对象比较少
    2、客户端只需要传递工厂类的参数,而无须关心创建对象的逻辑
  • 优点:使用户根据参数获取得对应的类实例,避免了直接实例化对象,降低耦合性
  • 缺点:可实例化的类型在编译期间已被缺点。如果新增新类型,则需要修改工厂,这是违背了开放封闭原则。简单工厂需要知道所有要成的类型,、其当子类过多或者子类层次过多时不适合使用。
 //抽象产品
    public abstract class Computer {
        /**
         * 产品的抽象方法,有具体的产品类实现
         */
        public abstract void start();
    }

 //具体的产品
    public class LenovoComputer extends Computer {

        @Override
        public void start() {
            System.out.println("联想计算机启动");
        }
    }

    public class HpComputer extends Computer {

        @Override
        public void start() {
            System.out.println("惠普计算机启动");
        }
    }

    public class AsusComputer extends Computer {

        @Override
        public void start() {
            System.out.println("华硕计算机启动");
        }
    }


public  class ComputerFactory {
    //工厂类
    public static Computer createComputer(String type) {
        switch (type) {
            case "lenovo":
                return new LenovoComputer();
            case "hp":
                return new HpComputer();
            case "asus":
                return new AsusComputer();

        }
        return null;
    }
}

测试

 @Test
 public void test(){
 Computer computer = ComputerFactory.createComputer("lenovo");
 computer.start();
}

locat

联想计算机启动

代理模式的简单实现

  • 代理模式从编码的角度来说可以分为静态代理和动态代理。
//抽象主题
public interface IShop {
    void buy();
}

//真实的主题
public class Man  implements IShop {

    @Override
    public void buy() {
        System.out.println("购买");
    }
}

//代理类
public class PurchingProxy implements IShop {
    private IShop mShop;
    public PurchingProxy(IShop mShop) {
        this.mShop = mShop;
    }

    @Override
    public void buy() {
        mShop.buy();
    }
}

测试

    @Test
    public void test2(){
        IShop man = new Man();
        IShop proxy = new PurchingProxy(man);
        proxy.buy();
    }

动态代理模式

public class DynamicPurchasing implements InvocationHandler {
    private Object object;

    public DynamicPurchasing(Object object) {
        this.object = object;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object resut = method.invoke(object, args);
        if (method.getName().equals("buy")){
            System.out.println("DynamicPurchasing,buy");
        }
        return resut;
    }
}

测试

  @Test
    public void test3(){
        IShop man = new Man();
        DynamicPurchasing dynamicPurchasing = new DynamicPurchasing(man);
        ClassLoader classLoader = man.getClass().getClassLoader();
        IShop purchasing= (IShop) Proxy.newProxyInstance(classLoader, new Class[]{IShop.class}, dynamicPurchasing);
        purchasing.buy();
    }

locat

购买
DynamicPurchasing,buy

观察者模式

  • 使用场景:
    1、关联行为场景。需要注意的是,关联行为是可拆分的,而不是“组合”关系。
    2、事件多级触发场景
    3、跨系统的消息交换场景,如消息队列、事件总线的处理机制。
  • 优点:
    1、观察者和被观察者之间是抽象耦合,容易扩展。
    2、方便建立一套触发机制。
  • 缺点:
    1、在应用观察者模式时需要考虑一下开发效率和运行效率的问题。程序中包括一个被观察者、多个观察者,开发、调试等内容会比较复杂,而且在Java中消息的通知一般是顺序执行的,那么一个观察者卡段,会影响到整体的执行效率,在这种情况下,一般采用异步方式。

//抽象观察者
public interface Observer {
    public void update(String message);
}


//具体的观察者
public class WeixinUser implements Observer {
    private String username;

    public WeixinUser(String username) {
        this.username = username;
    }

    @Override
    public void update(String message) {
        System.out.println(username+ " - "+message);

    }
}


public interface Subject {
    /**
     * 增加订阅者
     * @param observer
     */
    public void attach(Observer observer);

    /**
     * 删除订阅者
     * @param observer
     */
    public void detach(Observer observer);

    /**
     * 通知订阅者更新消息
     * @param message
     */
    public void notify(String message);
}




//具体被观察者
public class SubScriptionSubject implements Subject {

    private List<Observer> weixinUserList = new ArrayList<>();

    @Override
    public void attach(Observer observer) {
        weixinUserList.add(observer);
    }

    @Override
    public void detach(Observer observer) {
        weixinUserList.remove(observer);
    }

    @Override
    public void notify(String message) {
        for (Observer observer : weixinUserList) {
            observer.update(message);
        }
    }
}

测试


    @Test
    public void test4(){
        SubScriptionSubject subScriptionSubject = new SubScriptionSubject();
        //创建用户
        WeixinUser user1 = new WeixinUser("小米");
        WeixinUser user2 = new WeixinUser("小红");
        WeixinUser user3 = new WeixinUser("小胡");
        //订阅公众号
        subScriptionSubject.attach(user1);
        subScriptionSubject.attach(user2);
        subScriptionSubject.attach(user3);
        //公众号跟新发消息给订阅的微信用户
        subScriptionSubject.notify("王炸的专栏更新了");
    }

logcat

小米 - 王炸的专栏更新了
小红 - 王炸的专栏更新了
小胡 - 王炸的专栏更新了

相关文章

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • 设计模式笔记汇总

    目录 设计原则 “依赖倒置”原则 未完待续... 设计模式 设计模式——策略模式 设计模式——装饰者模式 设计模式...

  • 设计模式

    《C#设计模式》 《C#设计模式》-设计模式概述 《C#设计模式》-面向对象设计原则 《C#设计模式》-单例模式 ...

  • 浅谈JS的一些设计模式

    @(书籍阅读)[JavaScript, 设计模式] 常见设计模式 设计模式简介 设计模式概念解读 设计模式的发展与...

  • 前端设计模式

    JS设计模式一:工厂模式jS设计模式二:单例模式JS设计模式三:模块模式JS设计模式四:代理模式JS设计模式五:职...

  • 设计模式之工厂模式

    设计模式之工厂模式 标签(空格分隔): 设计模式 工厂模式 设计模式的感念 设计模式的应用 工厂设计模式的产生 工...

  • JavaJavascript基础进阶(十七)JS中常用的设计模式

    单利设计模式、构造原型设计模式、发布订阅设计模式、promise设计模式 单利模式 构造原型设计模式 最贴近OOP...

  • 设计模式 - 目录

    设计模式01 - 单例模式 设计模式02 - 工厂模式 设计模式03 - 建造者模式 设计模式04 - 适配器模式...

  • 第1章 设计模式概述

    一、设计模式的概念 二、设计模式的历史 三、设计模式的要素 四、设计模式的分类 ■ 创建型设计模式 ■ 结构型设计...

  • iOS设计模式(3)适配器模式

    设计模式系列文章 《iOS设计模式(1)简单工厂模式》《iOS设计模式(2)工厂模式》《iOS设计模式(4)抽象工...

网友评论

      本文标题:设计模式

      本文链接:https://www.haomeiwen.com/subject/mctefctx.html