裝飾者模式




1. 裝飾者模式(Decorator Pattern)

定義

在不改變原代碼結構的情況下,動態地擴展一個對象的功能,相比繼承有更靈活的實現方式。見名知意,其就是在需要增強功能的對象上包裝一層代碼,達到增強功能的效果


作用

裝飾者模式在對象創建好之后才動態給對象增加功能,也可以選擇不增加,自由靈活。而繼承是在對象創建時就已經確定,繼承如果要擴展功能,因為單繼承原因需要多重繼承,會顯得麻煩臃腫


2. 實現


准備

一條汪的接口

public interface Dog {
	abstract void eat();
}

某汪的實現類

public class MyDog implements Dog {
	public void eat() {
		System.out.println("狗吃肉");
	}
}

下面我們使用裝飾者模式給狗狗增加功能

2.1 首先得有裝飾器

//實現Dog接口
public abstract class DogDecorator implements Dog {

	private Dog dog;
    
	//用構造方法來獲取需要增強功能的狗狗
	public DogDecorator(Dog dog) {
		this.dog = dog;
	}

    //調用父類狗狗的功能
	public void eat() {
		dog.eat();
	}
}

2.2 用裝飾器來增強功能

我們想狗狗在吃飯前洗手,需要增加洗手的功能

//繼承裝飾類
public class WashHandDog extends DogDecorator {

	public WashHandDog(Dog dog) {
		super(dog);
	}
	
	//需要增強的功能
	public void WashHand(){
		System.out.println("吃飯前洗手");
	}

	//重寫方法
	public void eat(){
		WashHand();
		super.eat();
	}
}

現在還想狗狗吃完飯能去打怪獸

public class BeatMonster extends DogDecorator {

	public BeatMonster(Dog dog) {
		super(dog);
	}
	
	public void BeatMonster(){
		System.out.println("我的狗狗還能打小怪獸");
	}
	
	public void eat(){
		super.eat();
        BeatMonster();
	}
}

2.3 升級版狗狗出現

public static void main(String[] args) {
		
		Dog mydog = new MyDog();
		mydog = new WashHandDog(mydog);
		mydog = new BeatMonster(mydog);	
		mydog.eat();
}
吃飯前洗手
狗吃肉
我的狗狗還能打怪獸

至此我們的裝飾者模式就搞定了,是不是很簡單,以后遇到增強功能的需求時可以想一想裝飾者模式




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM