一、裝飾者模式:運作時動态地将責任附加到對象上。
1、裝飾者與被裝飾對象有相同的超類型
2、一個或多個裝飾者包裝一個對象
3、裝飾者在所委托被裝飾者的行為之前與/或之後加上自己的行為
4、可在運作時動态地不限量地裝飾
二、裝飾者缺點:大量小類、增加執行個體化難度
三、java.io中裝飾者應用
四、示例:
1、設計uml圖
2、coding
1>.抽象元件類
//component:abstract class
public abstract class beverage{
string description = "unknown beverage";
public string getdescription(){
return description;
}
public abstract double cost();
}
2>.具體元件類
//具體元件類:espresso
public class espresso extends beverage{
public espresso(){
description = "espresso";
public double cost(){
return 1.99;
//具體元件類:houseblend
public class houseblend extends beverage{
public houseblend(){
description = "houseblend";
return .89;
//具體元件類:darkroast
public class darkroast extends beverage{
public darkroast(){
description = "darkroast";
return 2.59;
//具體元件類:decaf
public class decaf extends beverage{
public decaf(){
description = "decaf";
return 4.00;
3>.裝飾者
//裝飾者:抽象類condimentdecorator
public abstract class condimentdecorator extends beverage{
public abstract string getdescription();
//裝飾者:milk
public class milk extends condimentdecorator{
beverage beverage;
public milk(beverage beverage){
this.beverage = beverage;
return beverage.getdescription() + ",milk";
return .55 + beverage.cost();
//裝飾者:mocha
public class mocha extends condimentdecorator{
public mocha(beverage beverage){
return beverage.getdescription() + ",mocha";
return .20 + beverage.cost();
//裝飾者:soy
public class soy extends condimentdecorator{
public soy(beverage beverage){
return beverage.getdescription() + ",soy";
return 1.56 + beverage.cost();
//裝飾者:whip
public class whip extends condimentdecorator{
public whip(beverage beverage){
return beverage.getdescription() + ",whip";
return .99 + beverage.cost();
4>.測試
//test class
public class testd{
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(beverage3);
beverage3 = new mocha(beverage3);
beverage3 = new whip(beverage3);
system.out.println(beverage3.getdescription() + "$" + beverage3.cost());
5>.測試結果
五、java.io裝飾者:大寫轉小寫
1、java.io.filterinputstream裝飾者
//java.io decorator:change uppercase to lowercase
import java.io.filterinputstream;
import java.io.inputstream;
import java.io.ioexception;
import java.lang.character;
public class lowercaseinputstream extends filterinputstream{
public lowercaseinputstream(inputstream is){
super(is);
public int read() throws ioexception{
int c = super.read();
return (c == -1?c:character.tolowercase((char)c));
public int read(byte[] b, int offset, int len) throws ioexception{
int c = super.read(b,offset,len);
for(int i = offset; i < offset + c; i++){
b[i] = (byte)character.tolowercase((char)b[i]);
}
return c;
2、資源testl.txt
//testl.txt
import java.lang.string;
import java.io.bufferedinputstream;
import java.io.fileinputstream;
public class testl{
public static void main(string[] arg) throws ioexception{
int c;
inputstream is = new lowercaseinputstream(new bufferedinputstream(new fileinputstream("testl.txt")));
while((c = is.read()) >= 0){
system.out.print((char)c);
is.close();
3、測試類
int c;
inputstream is = new lowercaseinputstream(new bufferedinputstream(new fileinputstream("testl.txt")));
4、測試結果