当前位置: 首页 > 编程语言 > C#

理解C#中的装饰器设计模式Share

时间:2023-04-10 21:10:49 C#

理解C#中的装饰器设计模式我刚开始学习装饰器设计模式,不幸的是我必须通过各种参考才能更好地理解装饰器,这让我很困惑.因此,据我了解,我相信它是装饰器模式interfaceIComponent{voidOperation();}classComponent:IComponent{publicvoidOperation(){Console.WriteLine("我在走路");}}classDecoratorA:IComponent{IComponent组件;publicDecoratorA(IComponentc){component=c;}publicvoidOperation(){component.Operation();Console.WriteLine("在雨中");}}classDecoratorB:IComponent{IComponent组件;publicDecoratorB(IComponentc){component=c;}publicvoidOperation(){component.Operation();Console.WriteLine("带伞");}}classClient{staticvoidMain(){IComponentcomponent=newComponent();组件.Operation();DecoratorAdecoratorA=newDecoratorA(newComponent());组件.Operation();DecoratorBdecoratorB=newDecoratorB(newComponent());组件.Operation();安慰。读();但是下面的代码也可以是装饰器模式吗?类照片{publicvoidDraw(){控制台。WriteLine("画一张照片");}}类BorderedPhoto:Photo{publicvoiddrawBorder(){Console.WriteLine("绘制边框照片");}}classFramePhoto:BorderedPhoto{publicvoidframe(){Console.WriteLine("framethephoto");}}classClient{staticvoidMain(){照片p=newPhoto();p.Draw();BorderedPhotob=newBorderedPhoto();b.绘制();b.drawBorder();FramePhotof=newFramePhoto();f.绘制();f.drawBorder();f.frame();我的理解从我给出的第二个例子来看,我们可以调用所有三个方法,但是从第一个例子来看,我不能通过创建单个对象来访问所有三个方法应该是注释,但我的话太多了。例如,您有一个像Repository:IRepository这样的对象和接口。公共接口IRepository{voidSaveStuff();}publicclassRepository:IRepository{publicvoidSaveStuff(){//savestuff}}和客户端,这可能不是你的类RepoClient{publicvoidDoSomethig(IRepositoryrepo){//...repo.SaveStuff();一旦你决定了,你应该记录所有对存储库的调用。但是你有一个问题-存储库-来自外部库的类并且你不想更改该代码。因此,您需要扩展您使用的存储库的行为。你写RepositoryLogDecorator:IRepository,在每个方法里做日志,比如publicclassRepositoryLogDecorator:IRepository{publicIRepository_inner;publicRepositoryLogDecorator(IRepositoryinner){_inner=inner;}publicvoidSaveStuff(){//记录进入方法try{_inner.SaveStuff();}catch(Exceptionex){//记录异常}//记录退出到方法}}所以,在你可以使用客户端之前varclient=newRepoClient();client.DoSomethig(newRepository());但是现在你可以使用varclient=newRepoClient();client.DoSomethig(newRepositoryLogDecorator(newRepository()));请注意,这是一个非常简单的示例。在实际项目中,对象使用DI容器创建主对象,您可以通过更改一些配置来使用装饰器。那么,使用什么装饰器:在不更改对象或客户端的情况下扩展对象的功能。装饰器的另一个好处:装饰器不依赖于Repository实现。只依赖于接口IRepository。为什么这是一个优势?如果您决定编写自己的实现publicclassMyAwesomeRepository:IRepository{publicvoidSaveStuff(){//保存东西,但是很棒!你可以用已经存在的装饰器自动装饰它varclient=newRepoClient();客户端.DoSomethig(新RepositoryLogDecorator(新MyAwesomeRepository()));想看真实软件的例子吗?(就像一个示例,代码很难看,我知道)=>到这里酷!爱它!:DYoutube上的这个PatternCraft系列解释了星际争霸的设计模式,您应该在此处查看有关装饰器的视频。在上面的视频中,作者给出了一个Marine和WeaponUpgrade。在游戏中你会有一个海军陆战队,然后你可以升级它的武器:marine=newWeaponUpgrade(marine);请注意,您仍然有一个海军陆战队员,它不是一个新单位,它与更改其属性的单位相同。公共类MarineWeaponUpgrade:IMarine{私人IMarine海洋;publicMarineWeaponUpgrade(IMarinemarine){this.marine=marine;}publicintDamage{get{returnthis.marine.Damage+1;}//这里设置{this.marine.Damage=value;您可以通过创建一个实现与您的单元相同的接口的类来访问您的单元属性以修改值。CodeWars上有一个Kata,要求您为海军陆战队完成武器和盔甲装饰。装饰器模式允许您将特定行为添加到给定类型的单个对象,而不影响相同类型的其他实例。在您的第二个示例(正常继承)中,该类的所有实例都继承了修改后的行为。PerGOF页面装饰器设计模式:动态地将附加职责附加到对象。装饰器提供了一种灵活的替代方法来扩展子类的功能。在你的第二个例子中,你使用继承来扩展类的行为,我认为这在技术上不是装饰器设计模式。第二个例子不是装饰器模式,因为装饰器模式的本质元素是对象接受其中之一并可能增强它。第一个例子中的实例是publicDecoratorA(IComponentc){component=c;此外,装饰器模式的目标是创建“一个”对象,然后通过将它传递给不同的过滤器或装饰器来装饰它。所以这一行DecoratorAdecoratorA=newDecoratorA(newComponent());应该是DecoratorAdecoratorA=newDecoratorA(component);以上就是C#学习教程:理解C#中装饰器设计模式的全部内容。会用到,需要详细了解C#学习教程。希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: