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