网站首页 新闻首页 网页设计图形动画软件编程网站开发办公软件操作系统数据库网络技术认证考试范文资料黑客攻防 书籍教程 进入论坛

设计模式之装饰者模式

http://www.diybl.com/ 2007-12-6  网络 点击:  [ 评论 ]
文章搜索:    【点击打包该文章】



OO设计原则:类应该对扩展开放,对修改关闭。
装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

写下星巴兹的代码
-->
public abstract class Beverage {
    String description 
= "Unknown Beverage";
    
public String getDescription() {
        
return description;
    }

    
public abstract double cost();
}


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


写饮料的代码
-->
public class Espresso extends Beverage {
    
public Espresso() {
        description 
= "Espresso";
    }

    
public double cost() {
        
return 1.99;
    }

}


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

    
public double cost() {
        
return .89;
    }

}


写调料的代码
-->
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();
    }

}


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();
    }

}


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();
    }

}


供应咖啡
-->
public class StarbuzzCoffee {
    
public static void main(String[] args) {
        Beverage beverage 
= new Espresso();
        System.out.println(beverage.getDescription() 
+
             
" $" + beverage.cost());

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

}

========================================================================
切实感受:运用模式的前提下、条件下,编写代码是一件有趣而又简单的事儿,您
会发现代码是如此的清晰、流畅、易于理解。可以毫不夸张地说,简直就像是一件
毫不雕琢的天然艺术品。
========================================================================
编写自己的Java I
/O装饰者-->
public class LowerCaseInputStream extends FilterInputStream {
    
public LowerCaseInputStream(InputStream in) {
        
super(in);
    }

    
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 result = super.read(b, offset, len);
        
for (int i=offset; i<offset+result; i++{
            b[i] 
= (byte)Character.toLowerCase((char)b[i]);
        }

        
return result;
    }

}


public class InputTest {
    
public static void main(String[] args) throws IOException {
        
int c;
        
try
        
{
            InputStream in 
=
                
new LowerCaseInputStream(
                    
new BufferedInputStream(
                        
new FileInputStream("test.txt")));
            
while (c = in.read() >= 0)
            
{
                System.out.print((
char)c);
            }

            in.close();
        }

        
catch (IOException e)
        
{
            e.printStackTrace();
        }

    }

}

========================================================================
OO基础:抽象、封装、继承、多态。
OO原则:封装变化;多用组合,少用继承;针对接口编程,不针对实现编程;为交
    互对象之间的松耦合设计而努力;对扩展开放,对修改关闭。
装饰者模式:动态地将责任附加到对象上。想要扩展功能,装饰者提供有别于继承
    的另一种选择。
========================================================================

如果图片或页面不能正常显示请点击这里 站内搜索:   

文章评论

请您留言