1.代理模式:为其他对象提供一种代理以控制对这个对象的访问。
代理模式中的三个角色:
1.抽象主题(subject):该角色是真实主题和代理主题的共同接口,以便于在任何可以使用真实主题的地方都可以使用代理主题。
2.代理主题(proxy subject):代理类(委托类),该角色负责控制对真实主题的引用,在真实主题角色处理完毕的前后做预处理和后处理工作。
3.真实主题(real subject):被代理的对象,业务逻辑的具体执行者。
代理设计模式的代码体现:
抽象主题:
/**
* 抽象主题
*/
public interface Boos {
void talk();
}
真实主题:
/**
* 真实主题
*/
public class RealBoos implements Boos{
@Override
public void talk() {
System.out.println("老板-开始谈项目");
}
}
代理主题:
/**
* 代理主题
*/
public class MiShu implements Boos{
private Boos boos;
public MiShu(Boos boos){
this.boos = boos;
}
@Override
public void talk() {
System.out.println("秘书-安排会议");
boos.talk();
System.out.println("秘书-记录会议");
}
}
测试类:
public class Test {
public static void main(String[] args) {
RealBoos realBoos = new RealBoos();
MiShu miShu = new MiShu(realBoos);
miShu.talk();
}
}
执行结果:
秘书-安排会议
老板-开始谈项目
秘书-记录会议
2.装饰模式:动态的给一个对象添加一些额外的职责。
装饰模式中的四个角色:
1.抽象构件(component):该角色用于规范需要装饰的对象。
2.具体构件(concrete component):该角色实现抽象构件接口,定义一个需要装饰的原始类。
3.装饰(decorator):该角色持有一个构件对象的实例,并定义了一个与抽象构件接口一致的接口。
4.具体装饰(concrete decorator):该角色负责对构件对象进行装饰。
装饰模式代码具体实现:
/***
* 抽象构件
*/
public interface Car {
void show();
}
/**
* 具体构件
*/
public class Benz implements Car{
@Override
public void show() {
System.out.println("一辆奔驰车开来了!");
}
}
/**
* 装饰
*/
public abstract class CarDecorator implements Car {
private Car car;
public CarDecorator(Car car){
this.car = car;
}
@Override
public void show() {
car.show();
}
}
/**
* 具体装饰
*/
public class ConcreteCarDecorator extends CarDecorator {
public ConcreteCarDecorator(Car car) {
super(car);
}
@Override
public void show() {
super.show();
print1();
print2();
}
private void print1() {
System.out.println("为奔驰车加油!");
}
private void print2() {
System.out.println("为奔驰车保养!");
}
}
测试类:
public class Test {
public static void main(String[] args) {
Benz benz = new Benz();
ConcreteCarDecorator decorator = new ConcreteCarDecorator(benz);
decorator.show();
}
}
打印结果:
一辆奔驰车开来了!
为奔驰车加油!
为奔驰车保养!