设计者模式

一、工厂方法模式 -----------> 创建复杂且大量的对象

     实现:定一个抽象类,各个自类去实现每一类的方法,最后由一个工厂模式去返回想要的对象,注重于对象

  优点 :

   a.用户只需知道所需产品对应的工厂,无需关心是怎么实现的

   b.加入新产品符合开闭原则,提供可扩展性

二、策略模式 ------------>需要实现大量的不同的方法

  实现:主要是写一个抽象接口的方法,由它的子类去实现,注重于方法,主要是为了取代if ... else .... 可以通过传入类似于HashMap去处理

 

三、建造者模式 ------------> 适用于复杂参数初始化,可以通过建造者模式来构建

  1.优点

   a.封装性好,创建和使用分离

   b.拓展性好、建造类之间独立、一定程度上解耦  

  2.缺点

    a.产生多余的Builder对象

     b.内部发生变化,建造者都需要修改的,成本比较大

  3.建造者模式和工厂模式的区别

     建造者模式:当创建对象需要很多方法时候适合用建造者模式(方法)

   工厂模式: 当需要一个对象适用于工厂模式(对象)

   案例:

     public class Course {
      private String courseName;
      public Course(CourseBuilder courseBuilder){
        this.courseName = courseBuilder.courseName;
        System.out.println(this.courseName);
      }
     public static class CourseBuilder{
      private String courseName;
     public CourseBuilder buildeCourseName(String courseName){
      this.courseName = courseName;
      return this;
    }
    public Course build() {
      return new Course(this);
    }
   }
  }

 

三、原型模式

      (1).适用于场景 : 类初始化消耗较多资源、new 产生一个对象需要非常繁琐的过程、构造函数比较复杂、循环体产生大量的对象

   (2). 优点 : 原型模式性能比直接new 一个对象性能高、其次简化创建过程

   (3). 缺点 : 必须配备克隆方法(核心)

      复写Object的clone的方法

     public class Mail implements Cloneable{
     @Override
     public Object clone() throws CloneNotSupportedException {
      System.out.println("这里是克隆模式");
      return super.clone();

    }

    使用:

    Mail mail = (Mail) new Mail().clone();

    这里涉及到深拷贝和浅拷贝的概念以及区别

    浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝     

    深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝 

四、外观模式(门面模式): 定义一个高层接口,让子系统更加容易使用

    优点:

    简化调用过程,无需了解调用的方法,避免带来的风险

    减少系统依赖、松散耦合(迪米特法则:最少知道的原则)

    缺点:

    不符合开闭的原则 : 对于扩展是开放的,对于修改是关闭  

五、装饰者模式(类似于继承对象,主要使用抽象类作为继承)

  优点 : 不改变原有的对象情况下给对象一个扩展功能

  缺点  : 会出现很多类,增加程序复杂性

  装饰者和适配器的区别

  装饰者:它和原来的的类具有相同的接口

  适配器:它和原来的类的接口是不同的

  

六、适配器模式(方法结果相同或者相似,但是只是接口命名不同)

  有类适配器模式、对象适配器模式

  优点 : 现有的类进行复用但不需要改变,目标类和适配器类解耦,提高了可扩展性

  适配器和外观模式的区别

  适配器: 只是再原有的基础上做了一下复用

  外观模式:再原有的基础上定义了新的接口,做了一个简单的访问接口

七、桥接模式(通过组合的方式建立两个类之间的联系)

  优点:分离了抽象部分和具体实体,易扩展性

八、代理模式 : 代理对象在客户端和目标对象之间起到中介作用

  优点:将代理对象与真实对象被调用的目标对象分离,降低耦合程度,拓展性好

  分为静态代理、动态代理

九、策略模式 : 主要是为了取代if ... else .... 可以通过传入类似于HashMap去处理

十、观察者模式 : 

  被观察对象需要继承Observable ,需要调用setChange() 、notifyObservers()

  观察者对象需要继承Observer,会重写update()方法

  //实现方式

  被观察者.addObservers(观察者)

十一、责任链模式:

 

 

 

 

一、工厂方法模式(定一个抽象类,各个自类去实现每一类的方法,最后由一个工厂模式去返回想要的对象,注重于对象)
    可以和策略模式做一个对比
    案例:
    public interface IceCream {

    public void taste();
    }

    public class AppleIceCream implements IceCream {
    public void taste(){ System.out.println("这是苹果口味的冰激凌");
    }
    }

    public class BananaIceCream implements IceCream {
    public void taste() { System.out.println("这是香蕉口味的冰激凌");
        }
    }

    
   public class IceCreamFactory {
    public static IceCream creamIceCream(String taste){
        IceCream iceCream = null; // 这里我们通过switch来判断,具体制作哪一种口味的冰激凌
        switch(taste){
            case "Apple":
                iceCream = new AppleIceCream();
            break;
            case "Orange":
                iceCream = new OrangeIceCream();
                break;
        }
        return iceCream;
    }
  }

  //代码实现
    IceCream appleIceCream = IceCreamFactory.creamIceCream("Apple");
    appleIceCream.taste();
    IceCream bananaIceCream = IceCreamFactory.creamIceCream("Banana");
    bananaIceCream.taste();

二、建造者模式
三、原型模式
四、外观模式(门面模式): 定义一个高层接口,让子系统更加容易使用
五、装饰者模式(类似于继承对象,主要使用抽象类作为继承)
六、适配器模式(方法结果相同或者相似,但是只是接口命名不同)
九、策略模式 : 主要是为了取代if ... else .... 可以通过传入类似于HashMap去处理
    案例:主要是写一个抽象接口的方法,有它的自类去实现(注重于方法)
    public abstract class CashSuper {
    public abstract double acceptCash(double money);
    }

    public class CashRebate extends CashSuper {
    @Override
    public double acceptCash(double money) {
        return money * 0.8;
    }
    }

十、观察者模式 :
  被观察对象需要继承Observable ,需要调用setChange() 、notifyObservers()

  观察者对象需要继承Observer,会重写update()方法


    public class People implements Observer {
    @Override
    public void update(Observable observable, Object o) {
        System.out.println(o.toString());
    }
    }

    public class Prodect extends Observable {
    private String msg = null;

    public void setChange(String msg){
        this.msg = msg;
        setChanged();
    }

    @Override
    protected synchronized void setChanged() {
        super.setChanged();
    }
    @Override
    public void notifyObservers() {
        super.notifyObservers(msg);
    }
}

        //实现方式
    //被观察者
        Prodect prodect = new Prodect();
    //观察者
        People people = new People();
        prodect.addObserver(people);
        prodect.setChange("你好");
        prodect.notifyObservers();


  被观察者.addObservers(观察者)
十一、责任链模式:
      public abstract class Leader {
    
        //需要子类继承,所以使用protected
    protected String leaderName;  //领导的姓名
    protected Leader nextLeader;  //写一个领导对象
    
    //通过构造方法注入领导的姓名或者也可以添加其他信息
    public Leader(String leaderName){
        this.leaderName = leaderName;
    }
 
    //采用set方法注入下一个领导
    public void setNextLeader(Leader nextLeader) {
        this.nextLeader = nextLeader;
    }
    
    //处理请假请求业务的抽象方法
    public abstract void headerRequest(LeaveRequest leaveRequest);
    }
 

--------------责任链的实现--------------------------------
      public class DeputyManager extends Leader{
 
    public DeputyManager(String leaderName) {
        super(leaderName);
    }
 
    @Override
    public void headerRequest(LeaveRequest leaveRequest) {
        if (leaveRequest.getLeaveDays() < 20) {  //副总监只处理小于20天的请假请求
            System.out.println("副总监批");
            System.out.println(leaveRequest.getLeaveName()+",请假"+leaveRequest.getLeaveDays()+"天,原因:"+leaveRequest.getReason());
        } else if(this.nextLeader != null){   //大于20天的交给下一个领导处理,首先需要判断下一个领导是否存在
            this.nextLeader.headerRequest(leaveRequest);
        }        
    }
    }

-------------代码实现-------------------------------------
     director.setNextLeader(deputyManager)
     deputyManager.setNextLeader(manager)

  

  

 

 

  

  

  

 

 

posted on 2019-09-30 21:05  zhang11111wei  阅读(166)  评论(0编辑  收藏  举报

导航