什么是装饰模式:
装饰模式就是动态的为一个对象添加新的功能,它是一种代替继承的技术,毋须通过继承增加子类就能拓展对象功能的模式。
开发中应用场景:
1.IO流中,设计的输入和输出
2.Servlet api提供的一个re quest对象的decrator模式的默认实现类HttpServletRequestWrap,遇到wrap字样的基本都是装饰模式
3.swing中图形设计界面的功能
实现例子:
首先是设计装饰模式接口,然后让子类实现
/**
* 能力接口
*
* @author liuxg
* @date 2016年5月27日 上午11:46:38
*/
public interface Ability {
void whatAblity(); // 有什么能力
}
public class Person implements Ability {
@Override
public void whatAblity() {
System.out.println("普通人而已");
}
}
class FlyPerson implements Ability {
private Ability ability;
public FlyPerson(Ability ability) {
this.ability = ability;
}
@Override
public void whatAblity() {
ability.whatAblity();
System.out.println("会飞的能力");
}
}
class StrengePerson implements Ability {
private Ability ability;
public StrengePerson(Ability ability) {
this.ability = ability;
}
@Override
public void whatAblity() {
ability.whatAblity();
System.out.println("超级大力气");
}
}
class ChangePerson implements Ability {
private Ability ability;
public ChangePerson(Ability ability) {
this.ability = ability;
}
@Override
public void whatAblity() {
ability.whatAblity();
System.out.println("会变身");
}
}
这里我们是想装饰一个人,让他有能飞,能变身,还还有超级大力气,这三种能力除了能一起,还能相互组合,继承做这个很麻烦吧
public class Client {
public static void main(String[] args) {
Person person = new Person();
person.whatAblity();
System.out.println("##########################");
FlyPerson flyPerson = new FlyPerson(person);
flyPerson.whatAblity();
System.out.println("##########################");
ChangePerson changePerson = new ChangePerson(flyPerson);
changePerson.whatAblity();
System.out.println("##########################");
StrengePerson strengePerson = new StrengePerson(changePerson);
strengePerson.whatAblity();
}
}