装饰者模式:
动态的将责任附加到对象上.若要扩展功能,装饰者提供了比继承更加有弹性的代替方案
继承和组合的区别:
继承:
使用继承,可以使子类在拥有自身方法的同时,还可以拥有父类的方法.
继承是静态的,在编译的时候就已经决定子类的行为,我们不便于控制增加行为的方式和动机.
组合:
将一个对象嵌入到另一个对象中,由另一个对象来决定是否引用该对象来扩展自己的行为.
这是一种动态的方式,我们可以在应用程序中动态控制
组合优缺点:
优点: 不会破坏类的封装性,且具有较好的松耦合性,可以是系统更加容易维护
缺点: 要创建比继承更多的对象
装饰者模式的优缺点:
优点:
1.装饰者模式可以提供比继承更多的灵活性
2.可以通过一种动态的方式来扩展一个对象的功能,在运行时选择不同的装饰器,
从而实现不同的行为
3.通过使用不同的具体装饰类以及这些装饰类的排列组合,
可以创造出很多不同行为的组合。
可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。
4.具体构件类与具体装饰类可以独立变化,
用户可以根据需要增加新的具体构件类和具体装饰类,在使用时再对其进行组合,
原有代码无须改变,符合“开闭原则”。
缺点:
1.会产生很多的小对象,增加系统的复杂性
2.装饰者比继承更加容易出错,排错也比较很困难.
对于多次装饰的对象,调试时寻找错误可能需要逐级排查,比较繁琐
装饰者模式的使用场景:
1.在不影响其它对对象的情况下,以动态,透明的方式给单个对象增加职责
2.需要动态的给一个对象增加功能,这些功能也可以动态的被撤销
实例:
StoreInter
public interface Store {
public abstract void sellFreshMeat();
}
MeatStore.java
public class MeatStore implements Store {
@Override
public void sellFreshMeat() {
System.out.println("卖新鲜大肉");
}
}
SellCook.java
public class SellCook implements Store {
private Store store;
@Override
public void sellFreshMeat() {
store.sellFreshMeat();
}
//构造方法
public SellCook(MeatStore mStore) {
this.store = mStore;
}
public void sellCook() {
System.out.println("卖烹饪肉");
}
}
Test.java
public class Test {
@org.junit.Test
public void test() {
MeatStore mStore = new MeatStore();
// meatStore.sellFreshMeat();
SellCook cook = new SellCook(mStore);
cook.sellFreshMeat();
cook.sellCook();
}
}