天天看點

入門設計模式之裝飾

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。部落格源位址為zhixiang.org.cn https://blog.csdn.net/myFirstCN/article/details/80871450

學習更多設計模式請參考: 入門設計模式之彙總篇

裝飾模式:以對用戶端透明的方式擴充對象的功能

裝飾模式類圖如下:

我們分析一下類圖:

  • Girl:女孩接口,定義了一個getName()方法
  • XiaoWang:女孩的實作類,她實作了getName方法,
  • Decorator:裝飾類,當我們想要擴充小王的方法時,又不能改變她的代碼,也不推薦使用繼承,那麼這個時候裝飾類就上場了。此裝飾類對小王進行了包裝,由他來提供小王的方法
  • Decorator1,Decorator2:當我們想要對小王裝飾的時候就可以使用此裝飾類

讓我們來看一下代碼實作吧

public interface Girl {
    public void getName();
}

public class XiaoWang implements Girl {
    @Override
    public void getName() {
        System.out.println("小王");
    }
}

public class Decorator implements Girl {
    private Girl girl;
   public Decorator(){}
    public Decorator(Girl girl){
        this.girl=girl;
    }
    @Override
    public void getName() {
        this.girl.getName();
    }
}

public class Decorator1 extends Decorator  {
    Decorator1(){

    }
    Decorator1(Girl girl){
        super(girl);
    }
    @Override
    public void getName() {
        System.out.println("小王1");
         super.getName();
    }
}

public class Decorator2 extends Decorator  {
    Decorator2(){

    }
    Decorator2(Girl girl){
        super(girl);
    }
    @Override
    public void getName() {
        System.out.println("小王2");
         super.getName();
    }
}
           

當我們需要對小王裝飾的時候隻需要下面如此調用就行了

public static void main(String[] args){
  Girl girl=  new Decorator1(new Decorator2(new XiaoWang()));
  girl.getName();
}

      

本文出自

https://zhixiang.org.cn/#/blog/read/cc798e1d-2026-4f78-b7b8-986277ab477e

,轉載請保留。

public interface Girl {
    public void getName();
}

public class XiaoWang implements Girl {
    @Override
    public void getName() {
        System.out.println("小王");
    }
}

public class Decorator implements Girl {
    private Girl girl;
   public Decorator(){}
    public Decorator(Girl girl){
        this.girl=girl;
    }
    @Override
    public void getName() {
        this.girl.getName();
    }
}

public class Decorator1 extends Decorator  {
    Decorator1(){

    }
    Decorator1(Girl girl){
        super(girl);
    }
    @Override
    public void getName() {
        System.out.println("小王1");
         super.getName();
    }
}

public class Decorator2 extends Decorator  {
    Decorator2(){

    }
    Decorator2(Girl girl){
        super(girl);
    }
    @Override
    public void getName() {
        System.out.println("小王2");
         super.getName();
    }
}
           
public static void main(String[] args){
  Girl girl=  new Decorator1(new Decorator2(new XiaoWang()));
  girl.getName();
}

      

繼續閱讀