設計模式——裝飾者模式

裝飾者模式:
 
首先定義抽象的組件類,子類繼承該類後持有抽象類的引用,在抽象類的基礎上能夠在調用父類方法先後分別執行本身的行爲。從而實現裝飾添加新的功能特性。再次強調了使用組合的好處。
強調對擴展開放,對修改關閉。
在Java I/O中應用了裝飾者模式。
 
裝飾者模式類圖:
 
 
如下程序來自Head First設計模式中的實例代碼,模擬了不一樣種類的飲料不一樣的售價計算方法。
 
1.定義飲料接口
 
package net.dp.decorator;

public abstract class Beverage {
	protected String description = "Unknown Beverage";

	public String getDescription() {
		return description;
	}

	public abstract double cost();
}

 

2.實現三種不一樣種類的飲料  java

package net.dp.decorator.coffee;

import net.dp.decorator.Beverage;

public class Espresso extends Beverage {

	public Espresso() {
		description = "Espresso";
	}

	public double cost() {
		return 1.99;
	}
}

  

package net.dp.decorator;

public abstract class Beverage {
	protected String description = "Unknown Beverage";

	public String getDescription() {
		return description;
	}

	public abstract double cost();
}

 

package net.dp.decorator.coffee;

import net.dp.decorator.Beverage;

public class HouseBlend extends Beverage {

	public HouseBlend() {
		description = "House Blend Coffee";
	}

	public double cost() {
		return .89;
	}
}

  

3.定義添加了調料的飲料抽象類設計模式

package net.dp.decorator;

public abstract class CondimentDecorator extends Beverage {
	public abstract String getDescription();
}

  

4.實現不一樣調料的飲料this

package net.dp.decorator.flovoring;

import net.dp.decorator.Beverage;
import net.dp.decorator.CondimentDecorator;

public class Mocha extends CondimentDecorator {
	Beverage beverage;

	public Mocha(Beverage beverage) {
		this.beverage = beverage;
	}

	public String getDescription() {
		return beverage.getDescription() + ", Mocha";
	}

	public double cost() {
		return .20 + beverage.cost();
	}
}

  

package net.dp.decorator.flovoring;

import net.dp.decorator.Beverage;
import net.dp.decorator.CondimentDecorator;

public class Soy extends CondimentDecorator {
	Beverage beverage;

	public Soy(Beverage beverage) {
		this.beverage = beverage;
	}

	public String getDescription() {
		return beverage.getDescription() + ", Soy";
	}

	public double cost() {
		return .15 + beverage.cost();
	}
}

  

package net.dp.decorator.flovoring;

import net.dp.decorator.Beverage;
import net.dp.decorator.CondimentDecorator;

public class Whip extends CondimentDecorator {
	Beverage beverage;

	public Whip(Beverage beverage) {
		this.beverage = beverage;
	}

	public String getDescription() {
		return beverage.getDescription() + ", Whip";
	}

	public double cost() {
		return .10 + beverage.cost();
	}
}

  

5.終於大功告成!跑一把!設計

package net.dp.decorator;

import net.dp.decorator.coffee.DarkRoast;
import net.dp.decorator.coffee.Espresso;
import net.dp.decorator.coffee.HouseBlend;
import net.dp.decorator.flovoring.Mocha;
import net.dp.decorator.flovoring.Soy;
import net.dp.decorator.flovoring.Whip;

public class StarbuzzCoffee {

	public static void main(String[] args) {
		Beverage beverage = new Espresso();
		System.out.println(beverage.getDescription() + " $" + beverage.cost());

		Beverage beverage2 = new DarkRoast();
		beverage2 = new Mocha(beverage2);
		beverage2 = new Mocha(beverage2);
		beverage2 = new Whip(beverage2);
		System.out
				.println(beverage2.getDescription() + " $" + beverage2.cost());

		Beverage beverage3 = new HouseBlend();
		beverage3 = new Soy(beverage2);
		beverage3 = new Mocha(beverage2);
		beverage3 = new Whip(beverage2);
		System.out
				.println(beverage3.getDescription() + " $" + beverage3.cost());
	}
}

 

能夠看到不一樣種類的飲料得出了不一樣的價格。blog

相關文章
相關標籤/搜索