为什么我们要使用装饰者模式
装饰者模式定义:
动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
上面也提到了装饰者比继承更有弹性,我们了解继承类具有父类的属性和方法或者重新定义、追加属性和方法.但是如果我们要想去加强业务逻辑或者行为时那就需要去修改原程序,要知道去修改原程序那可是一件艰苦的事情.
在展示新闻的同时给读取出来的新闻的人气加一,同时把新闻标题加入到RSS中,如果是用继承,就要往超类中增加相应的方法,如果是一个新增行为还是可以忍受的,如果此模块有不断增加业务的可能,那是不是要每次都要修改原程序呢?我想所有的朋友都不希望这样做。我们希望当有新的行为时才往旧对象上加,是在运行时加,并不是一开始就加。
解决方案:应用装饰者模式设计来满足这种***不断新增业务***的需求:
创建被装饰者顶级接口
//我们定义一个被装饰者顶级接口,指明初始的方法
public interface People {
//打英雄联盟
void playLoL();
//打梦幻西游
void playMengHuanXiYou();
}
创建被装饰者具体实例
//创建一个被装饰者类 ,实现people并且实现其方法
public class RealMan implements People {
public void playLoL() {
System.out.println("一起来玩英雄联盟把~");
}
public void playMengHuanXiYou() {
System.out.println("一起来玩梦幻西游吧~");
}
}
创建装饰者类
//定义装饰者,
public class Decorator implements People {
//引入被装饰者(抽象)
private People people;
public Decorator(People people) {
this.people = people;
}
//调用父接口方法,打LOL
public void playLoL() {
people.playLoL();
}
// 调用父接口方法,玩梦幻西游
public void playMengHuanXiYou() {
people.playMengHuanXiYou();
}
}
创建装饰者具体实例
//定义装饰者的具体事例,进行装饰
public class DecoratorMan extends Decorator {
public DecoratorMan(People people) {
super(people);
}
//增强的方法,可以根据具体业务进行扩展
public void ListenMusic(){
System.out.println("我正在听着歌!");
}
//增强的方法,可以根据具体业务进行扩展
public void EatFood(){
System.out.println("我正在吃饭!");
}
@Override
public void playLoL() {
super.playLoL();
ListenMusic();
}
@Override
public void playMengHuanXiYou() {
super.playMengHuanXiYou();
EatFood();
}
}
main方法进行test
public class test {
public static void main(String[] args) {
//创建一个被装饰者对象
RealMan realMan = new RealMan();
//创建装饰者对象
DecoratorMan decoratorMan = new DecoratorMan(realMan);
decoratorMan.playLoL();
decoratorMan.playMengHuanXiYou();
}
}
结果:
一起来玩英雄联盟把~
我正在听着歌!
一起来玩梦幻西游吧~
我正在吃饭!