代理模式是一种结构型设计模式,它允许通过创建一个代理对象来控制对另一个对象的访问。代理对象充当了客户端和真实对象之间的中介,从而可以对客户端的请求进行一些额外的处理。
我们有个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 在调用真实对象的下载方法之前和之后,分别添加了额外的功能,如权限检查和日志记录。通过使用代理模式,可以在不修改原始对象的情况下,增加一些额外的功能或者控制访问权限,从而更灵活地满足不同的需求。
装饰模式是一种结构设计模式,它允许在不改变原有对象的情况下,动态地给该对象添加功能。以下是一个装饰模式的示例。
我们复用代理模式中的正常业务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();
通过装饰模式,我们可以在不改变原有汽车对象的情况下,动态地给它添加了加速和换挡功能。这样可以实现代码的灵活扩展和复用。
总结来说,代理模式主要关注对对象的访问控制和保护,而装饰模式则主要关注对对象功能的动态扩展和组合。具体使用哪种模式取决于需求和场景。
本文链接:https://blog.nnwk.net/article/161
有问题请留言。版权所有,转载请在显眼位置处保留文章出处,并留下原文连接
Leave your question and I'll get back to you as soon as I see it. All rights reserved. Please keep the source and links
友情链接:
子卿全栈
全部评论