代理和装饰设计模式

本文详细介绍了代理模式和装饰模式在软件设计中的应用。代理模式通过创建代理类来控制对真实对象的访问,例如在老板与会议之间引入秘书作为代理,进行会前准备和会后记录。装饰模式则允许动态地给对象添加额外职责,如在奔驰车的基础上增加加油和保养的服务,增强了原有对象的功能而不改变其结构。这两种模式都是面向对象设计中常用的设计模式,能提高代码的灵活性和可扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
    }
}
打印结果:
一辆奔驰车开来了!
为奔驰车加油!
为奔驰车保养!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值