设计模式系列
1、组合模式
2、策略模式
3、单例模式
4、原型模式
5、模板模式
6、观察者模式
7、享元模式
8、装饰着模式
9、门面模式
10、责任链模式
11、建造者模式
12、适配器模式
文章目录
一: 什么是装饰着模式
在不改变现有的功能和结构的情况下,可以添加和扩展其功能,这种类型模式属于结构模式,也是作为现有类的一个包装类。
这种模式是一个装饰类,用原始类作为基础,在不改变方法签名完整性的前提下提供额外的功能。
码云地址:去看源码
1、定义一个 Camera 接口操作
这里定义一个Camera接口,定义了一个操作方法,这个操作方法即为拍照,可以是手机拍照,或者县级拍照。
interface Camera{
void operation();
}
2、实现拍照功能
实现拍照功能为手机拍照。
class CameraComponent implements Camera{
@Override
public void operation() {
System.out.println("手机拍照.");
}
}
3、定义一个装饰者
定义一个装饰着,来增强手机的拍照功能。
abstract class Decorator implements Camera{
Camera camera;
public Decorator(Camera camera) {
this.camera = camera;
}
}
4、增加美颜功能
在手机拍照功能前增加开启美颜功能。
class BeautyDecorator extends Decorator{
public BeautyDecorator(Camera camera) {
super(camera);
}
@Override
public void operation() {
System.out.println("开启美颜");
camera.operation();
}
}
5、增加滤镜功能
在手机拍照前开启滤镜功能。
class FilterDecorator extends Decorator{
public FilterDecorator(Camera camera) {
super(camera);
}
@Override
public void operation() {
System.out.println("开启滤镜");
camera.operation();
}
}
6、测试
滤镜功能装饰了美颜功能,美颜功能装饰了手机拍照功能。
public class DecoratedTest {
public static void main(String[] args) {
Camera camera = new FilterDecorator(new BeautyDecorator(new CameraComponent()));
camera.operation();
}
}
二:什么是门面模式(外观模式)
当调用复杂的子系统的接口时,可使用门面模式封装调用子系统的或者其他接口为一个对外的统一接口以供客户端调用,这种类型的模式属于结构模式,对外提供一个访问接口来隐藏系统的复杂性。
1、定义三个 Service 服务
class Service1{
public static void action(){
System.out.println("Service1 action ...");
}
}
class Service2{
public static void action(){
System.out.println("Service2 action ...");
}
}
class Service3{
public static void action(){
System.out.println("Service3 action ...");
}
}
2、定义门面服务
定义一个门面服务接口,封装复杂的调用其他服务的过程,对外统一访问接口。
class FacadeService{
public static void doActions(){
System.out.println("现在开始第一个服务:");
Service1.action();
System.out.println("现在开始第二个服务:");
Service2.action();
System.out.println("现在开始第三个服务:");
Service2.action();
}
}
3、测试
在这里只需要调用 门面服务的方法就可以了,不需要挨个调用 Service1, Service2, Service3。
public class FacadeTest {
public static void main(String[] args) {
//直接调用 facade servcie就可以调了其他服务
FacadeService.doActions();
}
}