【设计模式】6-10:装饰器模式、代理模式、工厂模式、原型模式、模板方法模式

第六章 装饰器模式

类的行为或其算法可以在运行时更改,属于行为型模式

应用:不同实现类的功能不同,一个策略结构,一个上下文类(接口参数),n个接口实现类

public class StrategyPatternDemo {
   public static void main(String[] args) {
      Context context = new Context(new OperationAdd());    
      System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
 
      context = new Context(new OperationSubtract());      
      System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
 
      context = new Context(new OperationMultiply());    
      System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
   }
}

第七章 代理模式

在访问一个类时做一些控制,通过代理实现对类的访问和控制

实现与被代理类方法的组合,为空时赋值再执行……

包含:接口、实现类、代理类,测试时父类引用(接口)指向子类对象

public class ProxyImage implements Image{
 
   private RealImage realImage;
   private String fileName;
 
   public ProxyImage(String fileName){
      this.fileName = fileName;
   }
 
   @Override
   public void display() {
      if(realImage == null){
         realImage = new RealImage(fileName);
      }
      realImage.display();
   }
}

第八章 工厂模式

创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

实例化工厂类,根据传入的参数,生成对应实体类的对象

使用工厂类返回指定的子类

用途:日志记录、数据库访问

public class ShapeFactory {
    
   //使用 getShape 方法获取形状类型的对象
   public Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }        
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();
      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();
      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }
      return null;
   }
}

调用

      ShapeFactory shapeFactory = new ShapeFactory();
 
      //获取 Circle 的对象,并调用它的 draw 方法
      Shape shape1 = shapeFactory.getShape("CIRCLE");
 
      //调用 Circle 的 draw 方法
      shape1.draw();

与简单工厂模式的区别:简单工厂模式是在测试类中进行选择判断,而工厂模式是编写工厂类,在工厂类中返回指定的对象

第九章 原型模式

用于创建重复的对象,同时又能保证性能,属于创建型模式

实现Cloneable接口,其clone方法用于创建当前对象的克隆

implements Cloneable
public Object clone() {
      Object clone = null;
      try {
         clone = super.clone();
      } catch (CloneNotSupportedException e) {
         e.printStackTrace();
      }
      return clone;
   }

根据key字符串的id,存入hashmap方法,从map中取值,返回对应对象的方法

第十章 模板方法模式

抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行

场景:有多个子类公用的方法,且逻辑相同

注意:一般模板方法都加上 final 关键词,以防止恶意操作

缺陷:多个子类均需要定义自己的子类实现,比较复杂

public abstract class Game {
   abstract void initialize();
   abstract void startPlay();
   abstract void endPlay();
 
   //模板
   public final void play(){
 
      //初始化游戏
      initialize();
 
      //开始游戏
      startPlay();
 
      //结束游戏
      endPlay();
   }
}

 

posted @ 2022-01-11 10:13  哥们要飞  阅读(54)  评论(0编辑  收藏  举报