关于java的几种设计模式——模板模式、工厂模式、代理模式

软件工程:共23种设计模式
5大设计原则:OCP(开闭原则)
一个软件实体如类、接口等应该对扩展开放,修改关闭。

设计模式先找第三方,找到这个第三方设计模式学会一半。

模板模式

一、模板设计模式(模板方法)-基于抽象类的设计模式

类比于实验模板、简历模板
第三方:模板类,将核心算法与具体子类相分离,子类只需要覆写具体的某几步流程即可。

模板方法的特点:在一个方法中定义一个算法的骨架(如冲泡饮料流程),而降一些步骤延迟到子类中实现。

模板方法的优点:模板模式可以使得子类在不改变核心算法的基础上,具体实现算法中的某些步骤。

代码重构:将两个方法(重复操作)提取出来放在基类(父类)中,让子类都继承此父类。
例如:咖啡与奶茶在制作过程中,烧水与倒入杯中的两个过程是重复操作。
将这两个方法提取出来放在基类(父类)中,让咖啡与茶都继承此父类。

class CaffeineBeverage {
    public void boliWater(){}
    public void pourInCup(){}
}

模板类的组成:

  • final修饰的核心算法
  • abstract修饰的抽象方法,延迟到子类实现
  • 普通具体方法,所有子类都一样,子类直接使用即可
  • 钩子方法 hook():默认不做事的方法,子类可以视情况而定是否需要覆写。

工厂模式

二、工厂设计模式
第三方:工厂类,将客户端的产生对象与具体子类分离,提取(解耦)到专门的工厂类中产生对象。

  1. 简单工厂模式
    问题本质:主方法(客户端)直接与具体产品交互。

特点:

  • 一个抽象产品类(接口,如Computer)

  • 多个具体的产品类(如Lenovo)

  • 一个工厂(负责生产所有具体商品,客户端与工厂交互,不与具体产品交互)

当多个具体产品呈现出家族式特征时(如微软系),为了保证不同产品系之间的隐私性,不同产品系有自己的工厂。

工厂方法模式(当产品出现家族式特征时)
特点:

  • 一个抽象产品类(接口,如Computer)

  • 多个具体的产品类(如Lenovo)

  • 一个抽象工厂

  • 多个具体工厂(如微软工厂)

代理模式

三、代理设计模式(类比代练、代购)
第三方:代理类,将真实业务与辅助操作解耦
特点:一个接口,两个子类,其中一个子类负责完成真实业务,另一个子类辅助之。

代理类中:
需要传入真实业务对象,代理类需要知道真实客户是谁,完成真实业务是由真实对象来完成,代理只需要辅助之。通过构造方法传入(下订单时,商家已经知道客户是谁)。

传入的是接口对象:只要是接口中定义的业务,代理类都可以进行代理。(只要是买电脑,代购都可以处理,若传入真实类,则只能代购具体品牌电脑)

interface ISubject{
    void buyComputer();
}
class RealSubject implements ISubject{
   public void buyComputer(){
      System.out.println("买一台外星人电脑");
   }
}
class ProxySubject implements ISubject{
   private ISubject subject;//真正的操作业务
   public ProxySubject(ISubject subject){
      this.subject=subject;
   }
   public void produceComputer(){
      System.out.println("1.生产外星人电脑");
   }
   public void afterSale(){
      System.out.println("3.外星人电脑售后团队");
   }
   public void buyComputer(){
      this.produceComputer();//真实操作前的准备
      this.subject.buyComputer();//调用真实业务
      this.afterSale();//操作后的收尾
   }
}
class Factory{
   public static ISubjectgetInstance(){
      return new ProxySubject(new RealSubject());
   }
}
public class Test{
   public static void main(String[] args){
      ISubject subject=Factory.getInstance();
      subject.buyComputer();
   }
}

你可能感兴趣的:(java详解)