美文网首页
设计模式

设计模式

作者: 大盗海洲 | 来源:发表于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

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

    相关文章

      网友评论

          本文标题:设计模式

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