装饰设计模式是对已经存在的对象增加新的功能,相比继承不会那么臃肿
首先定义一个接口,手机最基本的功能打电话
public interface Mobile {
public void call();
}
定义抽象的装饰类实现Mobile接口
public abstract class MobileDecorate implements Mobile {
private Mobile moblie;
public MobileDecorate(Mobile moblie) {
this.moblie = moblie;
}
@Override
public void call() {
this.moblie.call();
}
}
手机最基本的功能打电话的类
/**
* 手机最基本的功能
*/
public class MobileCall implements Mobile {
@Override
public void call() {
System.out.println("手机可以打电话");
}
}
增强功能的类--听MP3 要继承装饰类MobileDecorate
/**
* 手机听MP3类
*/
public class MobileMp3 extends MobileDecorate{
public MobileMp3(Mobile moblie) {
super(moblie);
}
@Override
public void call() {
super.call();
System.out.println("手机听MP3");
}
}
增强功能的类--看电影 要继承装饰类MobileDecorate
/**
* 手机看电影类
*/
public class MobileMovie extends MobileDecorate{
public MobileMovie(Mobile moblie) {
super(moblie);
}
@Override
public void call() {
super.call();
System.out.println("用手机看电影");
}
}
测试类
public static void main(String[] args) {
//普通手机
Mobile 小灵通 = new MobileCall();
小灵通.call();
System.out.println("----------------");
//增加MP3功能的手机(传原有的对象)
MobileDecorate mobileDecorate = new MobileMp3(小灵通);
mobileDecorate.call();
System.out.println("----------------");
//增加播放电影功能手机(传原有的对象)
mobileDecorate = new MobileMovie(小灵通);
mobileDecorate.call();
System.out.println("----------------");
//增加MP3和播放电影功能手机(无需新建MP3功能和电影功能的类)
mobileDecorate = new MobileMovie(new MobileMp3(小灵通));
mobileDecorate.call();
}
执行结果:
手机可以打电话
----------------
手机可以打电话
手机听MP3
----------------
手机可以打电话
用手机看电影
----------------
手机可以打电话
手机听MP3
用手机看电影