1. 程式人生 > 其它 >【設計模式】6-10:裝飾器模式、代理模式、工廠模式、原型模式、模板方法模式

【設計模式】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();
   }
}

本文來自部落格園,作者:哥們要飛,轉載請註明原文連結:https://www.cnblogs.com/liujinhui/p/15787150.html