代理模式和装饰模式的比较

7/19/2023 3:22:21 PM
514
0

1、代理模式

代理模式是一种结构型设计模式,它允许通过创建一个代理对象来控制对另一个对象的访问。代理对象充当了客户端和真实对象之间的中介,从而可以对客户端的请求进行一些额外的处理。

我们有个Car的业务,如下。这是一个再正常不过的业务了

public  interface  ICar{
	void DoSomething()
}


public  class Car:ICar{
	public   void  DoSomething(){
		Console.Writline("做某事儿。。。。")
	}
}

如果我们要使用代理模式,此时我们应该创建一个代理类来代理Car的行为

public class ProxyCar : ICar
{
       private readonly Car _realCar;

       public ProxyCar()
       {
              _realCar = new Car();
       }

       public void DoSomething()
       {
              Console.WriteLine("Before doing something...");   // 调用真实服务之前进行一些额外的操作

            
              _realCar.DoSomething();

              Console.WriteLine("After doing something...");   // 调用真实服务之后进行一些额外的操作

             
       }
}

只需要我们再消费端如此调用即可

ICar car = new ProxyCar();
car.Drive();

在以上示例中,代理对象 ProxyDownloader 在调用真实对象的下载方法之前和之后,分别添加了额外的功能,如权限检查和日志记录。通过使用代理模式,可以在不修改原始对象的情况下,增加一些额外的功能或者控制访问权限,从而更灵活地满足不同的需求。

2、装饰模式

装饰模式是一种结构设计模式,它允许在不改变原有对象的情况下,动态地给该对象添加功能。以下是一个装饰模式的示例。

我们复用代理模式中的正常业务ICar 和Car这两个业务类。

现在我们想给汽车添加额外的功能,比如加速和换挡。我们可以使用装饰模式来实现。首先,我们创建一个装饰器类CarDecorator,实现Car接口,并持有一个Car对象的引用:

public class CarDecorator:Car {
    protected Car car;

    public CarDecorator(Car car) {
        this.car = car;
    }


    public void DoSomething() {
        car.DoSomething();
    }
}

然后,我们创建具体的装饰器类,比如加速装饰器和换挡装饰器。它们都继承自CarDecorator,并在DoSomething()方法中添加额外的功能:

public class SpeedDecorator :CarDecorator {
    public SpeedDecorator(Car car) {
        super(car);
    }

    @Override
    public void DoSomething() {
        super.DoSomething();
        System.out.println("加速汽车");
    }
}




public class GearDecorator :CarDecorator {
    public GearDecorator(Car car) {
        super(car);
    }

    @Override
    public void DoSomething() {
        super.DoSomething();
        System.out.println("换挡汽车");
    }
}

最后,我们可以创建一个具体的汽车对象,并通过装饰器来动态地添加额外的功能:

ICar basicCar = new Car ();
ICar speedCar = new SpeedDecorator(basicCar);  //加速汽车
ICar gearCar = new GearDecorator(speedCar);
	   //换挡

gearCar.DoSomething();  

通过装饰模式,我们可以在不改变原有汽车对象的情况下,动态地给它添加了加速和换挡功能。这样可以实现代码的灵活扩展和复用。

 

3、特点

  • 代理模式中的代理类强依赖具体的类,在代理内部自行实例化被代理的类,被代理对象由代理类创建
  • 代理模式是代理类对被代理对象进行完全包装不对其透出,不会修改现有对象
  • 装饰模式中装饰类对被装饰的对象不强依赖,由调用者创建。因此装饰模式可以结合工厂方法创建对象,然后对对象进行装饰
  • 装饰模式是装饰类对对一个对象进行包装。可以有多个装饰类对其进行包装或者对上一个已经包装过的对象进行包装。类似于多层代理的嵌套,但是一般代理类只封装一次,不会多次嵌套。
  • 装饰模式强调对已有的对象上动态地添加功能,而不是修改其原始代码

总结来说,代理模式主要关注对对象的访问控制和保护,而装饰模式则主要关注对对象功能的动态扩展和组合。具体使用哪种模式取决于需求和场景。

全部评论



提问