美文网首页
headfrist 设计模式

headfrist 设计模式

作者: 木书 | 来源:发表于2017-11-04 22:21 被阅读16次

    导语:此文章主要记述几种设计模式的定义、类图与设计原则,需要此前对设计模式有一定了解,详细可以阅读《head frist 设计模式》,若想一起讨论、学习,请加QQ群:518105162

    一、策略模式:

    定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。


    策略模式

    设计原则:

    • 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
    • 针对接口编程,而不是针对实现编程。
    • 多用组合,少用继承。

    二、观察者模式

    定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。


    观察者模式

    设计原则:

    • 为了交互对象之间的松耦合设计而努力。

    三、装饰者模式

    动态地将责任附加到对象上。如要扩展功能,装饰者提供了比继承更有弹性的替代方案。


    装饰者模式定义类图

    星巴兹咖啡销售系统装饰者模式类图关系:

    装饰者模式

    四、工厂模式:

    简单工厂:

    • 建立一个简单工厂
    public class SimplePizzaFactory {
    
        public Pizza createPizza(String type) {
            Pizza pizza = null;
    
            if (type.equals("cheese")) {
                pizza = new CheesePizza();
            } else if (type.equals("pepperoni")) {
                pizza = new PepperoniPizza();
            } else if (type.equals("clam")) {
                pizza = new ClamPizza();
            } else if (type.equals("veggie")) {
                pizza = new VeggiePizza();
            }
            return pizza;
        }
    }
    
    • 将生产披萨的任务委托给这个工厂
    public class PizzaStore {
        SimplePizzaFactory factory;
     
        public PizzaStore(SimplePizzaFactory factory) { 
            this.factory = factory;
        }
     
        public Pizza orderPizza(String type) {
            Pizza pizza;
     
            pizza = factory.createPizza(type);
     
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
    
            return pizza;
        }
    
    }
    
    

    工厂方法模式:

    定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

    工厂方法模式定义类图

    披萨店关系类图:

    • 创建者类:


      工厂方法模式
    • 产品类:
    工厂方法模式

    抽象工厂模式:

    提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

    设计原则:

    • 要依赖抽象,不要依赖具体类。

    这个原则告诉我们,应该重写代码以便于我们依赖抽象类,而不是依赖具体类。对于高层及低层模块都应该如此。

    五、单例模式(单件模式)

    确保一个类只有一个实例,并提供一个全局访问点。


    单例模式
    • 懒加载单例:
    public class Singleton {
        private static Singleton uniqueInstance;
     
        // other useful instance variables here
     
        private Singleton() {}
     
        public static  Singleton getInstance() {
            if (uniqueInstance == null) {
                uniqueInstance = new Singleton();
            }
            return uniqueInstance;
        }
     
        // other useful methods here
        public String getDescription() {
            return "I'm a thread safe Singleton!";
        }
    }
    
    • 急加载单例:
    public class Singleton {
        private static Singleton uniqueInstance = new Singleton();
     
        private Singleton() {}
     
        public static Singleton getInstance() {
            return uniqueInstance;
        }
        
        // other useful methods here
        public String getDescription() {
            return "I'm a statically initialized Singleton!";
        }
    }
    

    如果不做处理的话,急加载单例比懒加载更加线程安全,但是如果懒加载使用synchronized“锁住”getInstance方法的话,就会变成线程安全的单例。但是这两种线程安全的方式都降低了程序性能,可以在使用懒加载时给uniqueInstance字段加volatile关键字以提高程序执行性能。

    六、命令模式

    将请求封装成对象,这可以让你使用不同的请求、队列,或者日志请求来参数化其他对象。命令模式也可以支持撤销操作。

    七、适配器模式

    适配器(adapter-pattern):将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

    • 对象适配器(组合)
    • 类适配器(多重继承):在Java中不能实现

    外观模式(facade-pattern):提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

    要点:

    • 当需要使用一个现有的类而其接口不符合需要时,使用适配器。适配器改变接口以符合客户期望。
    • 当需要简化并统一一个很大的接口或一群复杂的接口时,使用外观。外观将客户从一个复杂的子系统中解耦。
    • 适配器与装饰者的区别:适配器将一个对象包装起来以改变接口;装饰者将一个对象包装起来以增加新的行为和责任;而外观将一群对象“包装”起来以简化接口。


      适配器类图

    十一、代理模式

    代理模式:为另一个对象提供一个替身或占位符以控制对这个对象的访问。

    • 使用java RMI
      RMI提供了客户辅助对象和服务辅助对象,为客户辅助对象创建和服务对象相同的方法。
      制作远程服务的步骤:
      步骤一:制作远程接口
      步骤二:制作远程的实现
      步骤三:利用rmic产生的stub和skelton。
      步骤四:启动RMIregistry(rmiregisry)
      步骤五:开始远程服务

    结语:

    如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【喜欢】一下!如果你有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。

    相关文章

      网友评论

          本文标题:headfrist 设计模式

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