天天看點

Decorator Pattern

一、裝飾者模式:運作時動态地将責任附加到對象上。

        1、裝飾者與被裝飾對象有相同的超類型

        2、一個或多個裝飾者包裝一個對象

        3、裝飾者在所委托被裝飾者的行為之前與/或之後加上自己的行為

        4、可在運作時動态地不限量地裝飾

二、裝飾者缺點:大量小類、增加執行個體化難度

三、java.io中裝飾者應用

Decorator Pattern

四、示例:

        1、設計uml圖

Decorator Pattern

        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>.測試結果

Decorator Pattern

五、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、測試結果

Decorator Pattern

繼續閱讀