【设计模式】结构型02装饰模式(Decorator Pattern)
意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。
何时使用:1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接待员"即可。2、定义系统的入口。
如何解决:客户端不与系统耦合,外观类与系统耦合。
代码:
1、我这里有一个服务接口,持有一个对外提供服务的共有方法 provide(),本接口有三个实现类,分别是音乐窗口、视频窗口和学习窗口类:
package com.pat.facade;
/**
* 外观模式,被统筹类的接口
* @author ZX
*/
public interface ServiceWindows {
//提供服务的方法
void provide();
}
/**
* 音乐播放器接口
* @author ZX
*
*/
class Music implements ServiceWindows{
@Override
public void provide() {
System.out.println("播放音乐~我的滑板鞋~滑板鞋~鞋~");
}
}
/**
* 视频播放器接口
* @author ZX
*
*/
class Video implements ServiceWindows{
@Override
public void provide() {
System.out.println("播放视频~非洲农业不发达~就用金坷垃~~~");
}
}
/**
* 学习资料接口
* @author ZX
*/
class Study implements ServiceWindows{
@Override
public void provide() {
System.out.println("学习资料.zip》重命名 学习资料.avi");
System.out.println("开始播放:学习资料.avi");
}
}
2、外观模式核心,提供一个面板类阻止对象,本类就是外观模式的核心:
package com.pat.facade;
/**
* 外观模式核心-更高层的和新接口控制器,至于对象的创建可使用任何方式,这里采用最简单的方式
* @author ZX
*
*/
public class FacadeController {
private ServiceWindows music;
private ServiceWindows video;
private ServiceWindows studyData;
public FacadeController() {
this.music = new Music();
this.video= new Video();
this.studyData= new Study();
}
public void playMusic() {
music.provide();
}
public void playVideo() {
video.provide();
}
public void beginStudy() {
studyData.provide();
}
}
3、测试类:
package com.pat.facade;
/**
* 测试类
* @author ZX
*
*/
public class Test {
public static void main(String[] args) {
FacadeController fc = new FacadeController();
fc.playMusic();
fc.playVideo();
fc.beginStudy();
}
}
4、结果:
播放音乐~我的滑板鞋~滑板鞋~鞋~
播放视频~非洲农业不发达~就用金坷垃~~~
学习资料.zip》重命名 学习资料.avi
开始播放:学习资料.avi