\quad
装饰器模式是GOF23种设计模式中较为常用的一种模式。它可以实现对原有类的包装和装饰,使新的类具有更强的功能。
\quad
我这里有饮料咖啡, 我们可以通过加入牛奶或蔗糖,实现原有饮料口味的扩展和价格的变化。这就是一种“装饰器模式”。 我们在未来给普通人加装“外骨骼”装饰,让普通人具有力扛千斤的能力,也是一种“装饰器模式”。
装饰器模式演示
/**
* 模拟咖啡
* 1、抽象组件:需要装饰的抽象对象(接口或抽象父类)
* 2、具体组件:需要装饰的对象
* 3、抽象装饰类:包含了对抽象组件的引用以及装饰者共有的方法
* 4、具体装饰类:装饰的对象
* @author 影随风
*/
public class DecorateTest02 {
public static void main(String[] args) {
Drink coffee = new Coffee();
Drink suger = new Suger(coffee); //装饰
System.out.println(suger.info() + "-->" + suger.cost());
Drink milk = new Milk(coffee); //装饰
System.out.println(milk.info() + "-->" + milk.cost());
milk = new Milk(suger); //装饰
System.out.println(milk.info() + "-->" + milk.cost());
}
}
//抽象组件
interface Drink {
double cost();
String info();
}
//具体组件
class Coffee implements Drink {
private String name = "原味咖啡";
@Override
public double cost() {
return 10;
}
@Override
public String info() {
return name;
}
}
//抽象装饰类
abstract class Decorate implements Drink {
//对抽象组件的引用
private Drink drink;
public Decorate(Drink drink) {
this.drink = drink;
}
@Override
public double cost() {
return drink.cost();
}
@Override
public String info() {
return drink.info();
}
}
//具体装饰类
class Milk extends Decorate {
public Milk(Drink drink) {
super(drink);
}
@Override
public double cost() {
return super.cost() * 4;
}
@Override
public String info() {
return super.info() + "加入了牛奶";
}
}
class Suger extends Decorate {
public Suger(Drink drink) {
super(drink);
}
@Override
public double cost() {
return super.cost() * 2;
}
@Override
public String info() {
return super.info() + "加入了蔗糖";
}
}
执行结果
在IO流中,BufferedInputStream就是对InputStream的一个装饰类,它的缓冲流使得IO效率更高。
public class CopyTxt {
public static void main(String[] args) {
String s1 = "abc.txt";
String s2 = "dest.txt";
copy(s1, s2);
}
public static void copy(String _src, String _des) {
File src = new File(_src);
File des = new File(_des);
//使用JDK7新增的try-with-resources语法省略释放资源操作
try(BufferedReader br = new BufferedReader(new FileReader(src));
BufferedWriter bw = new BufferedWriter(new FileWriter(des))) {
String line = null;
while((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}