Java模板设计模式&工厂设计模式&代理设计模式

文章目录

  • 模板设计模式
      • 1.定义
      • 2.实现
      • 3.钩子方法
  • 工厂设计模式
    • 一、简单工厂模式
      • 1.特点
      • 2.结构图
      • 3.实现
    • 二、工厂方法模式
      • 1.特点
      • 2.结构图
      • 3.实现
  • 代理设计模式
      • 1.特点
      • 2.本质
      • 3.实现

模板设计模式

1.定义

在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

2.实现

abstract class Beverage{
    final void prepareRecipe(){
        boilwater();
        brew();
        pourInCup();
        addCondiments();
    }
    abstract void addCondiments();
    abstract void brew();

    void boilwater(){
        System.out.println("烧水");
    }
    void pourInCup(){
        System.out.println("倒入杯中");
    }

}
class Coffee extends Beverage{
    @Override
    void addCondiments() {
        System.out.println("加糖和牛奶");
    }
    @Override
    void brew() {
        System.out.println("冲咖啡");
    }
}
class Tea extends Beverage{
    @Override
    void addCondiments() {
        System.out.println("加柠檬");
    }
    @Override
    void brew() {
        System.out.println("泡茶");
    }
}

public class test{
public static void main(String[]args){
    Tea tea = new Tea();
    tea.prepareRecipe();
    System.out.println("------------------");
    Coffee coffee = new Coffee();
    coffee.prepareRecipe();
    }
}

3.钩子方法

abstract class Beverage{
    final void prepareRecipe(){
        boilwater();
        brew();
        pourInCup();
        if(customerWant())
        addCondiments();
    }
    abstract void addCondiments();
    abstract void brew();

    void boilwater(){
        System.out.println("烧水");
    }
    void pourInCup(){
        System.out.println("倒入杯中");
    }
// 钩子方法
// 超类中通常是默认实现
// 子类可以选择性的覆写此方法
    boolean customerWant(){
        return true;
    }
}
class Coffee extends Beverage{
    @Override
    void addCondiments() {
        System.out.println("加糖和牛奶");
    }
    @Override
    void brew() {
        System.out.println("冲咖啡");
    }
}
class Tea extends Beverage{
    @Override
    void addCondiments() {
        System.out.println("加柠檬");
    }
    @Override
    void brew() {
        System.out.println("泡茶");
    }
    public boolean customerWant(){
        String answer = getUserInput();
        if (answer.equals("y")){
            return true;
        }else
            return false;
    }
    private String getUserInput(){
        String answer = null;
        System.out.println("请问您需要加柠檬吗?y/n");
        Scanner scanner = new Scanner(System.in);
        answer = scanner.nextLine();
        return answer;
    }
}

public class test{
public static void main(String[]args){
    Tea tea = new Tea();
    tea.prepareRecipe();
    System.out.println("------------------");
    Coffee coffee = new Coffee();
    coffee.prepareRecipe();
    }
}

工厂设计模式

一、简单工厂模式

1.特点

一个抽象产品类(接口)——computer
多个具体产品类——MacBook、surface
一个工厂(new操作在此工厂中进行)——客户端通过工厂类获取具体实例

2.结构图

Java模板设计模式&工厂设计模式&代理设计模式_第1张图片

3.实现

interface IComputer{
    void buyComputer();
}
class Factory{
    //此时Factory产生实例化对象没有意义,对外提供工具方法
    public static IComputer getInstance(String classname){
        if("MacBook".equals(classname)){
            return new Macbook();
        }else if("surface".equals(classname)){
            return new surface();
        }else
            return null;
    }
}
class Macbook implements IComputer{
    @Override
    public void buyComputer() {
        System.out.println("买macbook");
    }
}
class surface implements IComputer{
    @Override
    public void buyComputer() {
        System.out.println("买suface电脑");
    }
}
public class test{
public static void main(String[]args){
    IComputer computer = Factory.getInstance("MacBook");
    computer.buyComputer();
    }
}

二、工厂方法模式

1.特点

定义一个用来创建对象的接口,让子类决定实例化哪一个类。针对每个产品(产品族)提供一个工厂类,客户端需要判断使用哪个工厂。
a.一个抽象产品类
b.多个具体产品类
c.一个抽象工厂(针对抽象产品类)
d多个具体工厂(每个产品族拥有自己的工厂)

2.结构图

Java模板设计模式&工厂设计模式&代理设计模式_第2张图片

3.实现

interface IComputer{
    void buyComputer();
}
interface IComputerFactory{
    IComputer createComputer();
}
class MsFactory implements IComputerFactory{
    @Override
    public IComputer createComputer() {
        return new surface();
    }
}
class AppleFactory implements IComputerFactory{

    @Override
    public IComputer createComputer() {
        return new Macbook();
    }
}
class Macbook implements IComputer{
    @Override
    public void buyComputer() {
        System.out.println("买macbook");
    }
}
class surface implements IComputer{
    @Override
    public void buyComputer() {
        System.out.println("买suface电脑");
    }
}
public class test{
public static void main(String[]args){
    IComputer computer = new  MsFactory().createComputer();
    computer.buyComputer();
    }
}

代理设计模式

1.特点

两个子类共同实现同一个接口,其中一个子类负责真实业务实现,另外一个子类完成辅助真实业务主题的操作。

2.本质

所有的真实业务操作都会有一个与之辅助的工具类(功能类)共同完成。

3.实现

interface ISubject{
    void buyComputer();
}
class RealSubject implements ISubject{
    @Override
    public void buyComputer() {
        System.out.println("买一台笔记本电脑");
    }
}
class ProxySubject implements  ISubject{
    private ISubject iSubject;
    public ProxySubject(ISubject iSubject){
        this.iSubject = iSubject;
    }
    public void produceComputer(){
        System.out.println("生产一台笔记本电脑");
    }
    public  void afterSale(){
        System.out.println("笔记本售后");
    }
    @Override
    public void buyComputer() {
        this.produceComputer();
        this.iSubject.buyComputer();
        this.afterSale();
    }
}
class Factory {
    public static ISubject getInstance(){
        return new ProxySubject(new RealSubject()) ;
    }
}
public class TestDemo {
    public static void main(String[] args) {
        ISubject subject = Factory.getInstance() ;
        subject.buyComputer() ;
    }
}

你可能感兴趣的:(Java)