首页 > 其他分享 >10_装饰模式

10_装饰模式

时间:2024-03-11 11:48:20浏览次数:31  
标签:10 Name Invoke 模式 public person 组件 装饰

装饰模式是一种结构型设计模式,它允许我们在不改变现有对象结构的情况下,动态地向对象添加额外的功能。

装饰模式有四个主要角色:

  1. 抽象组件(Component):定义了一个抽象接口,用于被具体组件和具体装饰器实现。

  2. 具体组件(Concrete Component):实现了抽象组件接口,是被装饰的对象。

  3. 抽象装饰器(Decorator):继承自抽象组件,并包含一个抽象组件的引用,用于对组件进行装饰。

  4. 具体装饰器(Concrete Decorator):继承自抽象装饰器,并实现了具体的装饰逻辑。

装饰模式的工作原理如下:

  1. 抽象组件定义了组件的接口,具体组件实现了该接口。

  2. 抽象装饰器继承自抽象组件,并包含一个抽象组件的引用。

  3. 具体装饰器继承自抽象装饰器,并实现了具体的装饰逻辑。

  4. 客户端可以通过抽象组件的引用调用组件的方法,而具体装饰器会在调用前后添加额外的功能。

装饰模式的优点包括:

  1. 可以动态地添加或删除对象的功能,避免了使用继承的静态特性。

  2. 可以按需添加多个装饰器,实现不同的组合效果。

  3. 可以保持对象接口的一致性,使得客户端无需关心具体的装饰器。

装饰模式适用于以下场景:

  1. 当需要在不改变现有对象结构的情况下,动态地向对象添加额外功能时,可以使用装饰模式。

  2. 当需要按需添加多个额外功能的组合时,可以使用装饰模式。

总结而言,装饰模式通过动态地向对象添加额外的功能,而不改变现有对象结构。它提供了一种灵活的方式来扩展对象的功能,并保持了对象接口的一致性。

 

Component

public abstract  class Person
    {
        public virtual string Name { get; set; }
        public virtual void Eat()
        {
            Console.WriteLine($"{Name}能吃饭");
        }

        public virtual void Sleep()
        {
            Console.WriteLine($"{Name}能睡觉");
        }

        public abstract void Invoke();
    }

 

Concrete Component

/// <summary>
    /// 婴儿
    /// </summary>
    public sealed class Baby : Person
    {
        public override void Invoke()
        {
            this.Eat();
            this.Sleep();
        }
    }

 

Decorator

 public abstract  class Decorater:Person
    {
        protected Person person { get; private set; } = null;

        public Decorater(Person person)
        {
            this.person = person;
        }

        public override void Invoke()
        {
            if(person !=null)
            {
                person.Invoke();
            }
        }
    }

 

Concrete Decorator

 public sealed class Child : Decorater
    {
        public Child(Person person) : base(person)
        {
            this.Name= person.Name;
        }

        public override void Invoke()
        {
            base.Invoke();
            Console.WriteLine($"{Name}长大了,7岁");
        }
    }
public sealed class Boy : Decorater
    {
        public Boy(Person person) : base(person)
        {
            this.Name= person.Name;
        }

        public override void Invoke()
        {
            base.Invoke();

            Console.WriteLine($"{Name}成年了,可以结婚!");
        }
    }

 

调用

public class Client
    {
        public void Start()
        {
            Baby baby = new Baby() { Name = "张三" };
            baby.Invoke();

            Console.WriteLine("--------------装饰-------------------");
            //装饰
            Child child=new Child(baby);
            child.Invoke();

            Console.WriteLine("------------------------------------");

            Boy boy = new Boy(child);
            boy.Invoke();
        }
    }
static void Main(string[] args)
        {
            new Client().Start();
            Console.ReadKey();
            Console.WriteLine("Hello, World!");
        }

 

标签:10,Name,Invoke,模式,public,person,组件,装饰
From: https://www.cnblogs.com/MingQiu/p/18065742

相关文章

  • P3878 [TJOI2010] 分金币
    题意有\(n\)枚金币,第\(i\)枚价值为\(s_i\)。分成两部分,使得两部分数量之差不超过\(1\),求价值之差最小是多少。Sol模拟退火!其实这个算法没什么好说的。设当前最优解与当前解的差为\(\DeltaE\)。那么当前状态发生转移的概率为\(P(f(n))=\begin{cases}1,&\text{......
  • 上周热点回顾(3.4-3.10)
    热点随笔:· 这波操作看麻了!十亿行数据,从71s到1.7s的优化之路。 (why技术)· 开源.NET8.0小项目伪微服务框架(分布式、EFCore、Redis、RabbitMQ、Mysql等) (aehyok)· C#/.NET/.NETCore优秀项目和框架2024年2月简报 (追逐时光者)· AI应用开发之路-准备:发起一个开源小项目D......
  • 09_组合模式
    组合模式是一种结构型设计模式,它允许我们将对象组合成树状结构,以表示“整体-部分”的层次结构。组合模式使得客户端可以统一地处理单个对象和组合对象,无需区分它们的差异。组合模式有三个主要角色:组件(Component):定义了组合中的对象的公共接口,可以是抽象类或接口,并提供了一些默......
  • 给python入门者的帮助,关于函数和装饰器的理解。
    有时候学习不能过于较真,至少在合适的时机之前,还是闷头吞知识,等吃饱了,就有精力(足够的能量储备,足够的经验)来理解更深的理解,但是很多时候,包括我自己,都喜欢在吃饱之前就研究自己在吃什么,为什么这个东西能吃这种问题。最近发现几年前写的一篇关于python函数return的一些理解,又被查......
  • 20240310-日记(包含0306-0309)
    为了证明0306号那天我是真准备写的。今天仍然是无所事事的一天,好像因为起得越来越晚,对象颇有微词了。昨天猫又在房间里跑酷,其实也算没怎么睡好。也是今天突然得知,入宅又变更到周五凌晨了。0307因为昨天刚得知还需要周五凌晨入住宅,所以对象的爹从老家赶过来,是晚上十点四十到......
  • 使用@Autowired + Map 实现策略模式
    创建接口publicinterfaceUserService{StringgetName();}创建多个类实现上面的接口实现一importcom.boot.service.UserService;importorg.springframework.stereotype.Service;@Service("zhangsan")publicclassZhangsanUserServiceImplimplementsUserServ......
  • CCE集群VPC网络模式下几种访问场景
    本文分享自华为云社区《【理解云容器网络】5-CCE集群VPC模型容器网络走线介绍》,作者:可以交个朋友。简介鉴于在CCE集群使用VPC网络模型,处理遇到的一些网络问题时,需要熟悉不同场景下数据包的流转过程,才能快速的解决问题。本文主要介绍CCE集群VPC网络模式下各种访问场景介绍。VPC......
  • zookeeper源码(10)node增删改查及监听
    本文将从leader处理器入手,详细分析node的增删改查流程及监听器原理。回顾数据读写流程leaderZookeeperServer.processPacket封装Request并提交给业务处理器LeaderRequestProcessor做本地事务升级PrepRequestProcessor做事务准备ProposalRequestProcessor事务操作发proposal......
  • Go 中的监视器模式与配置热更新
    Go中的监视器模式与配置热更新原创 波罗学 码途漫漫 2024-03-1108:03 上海 听全文上篇介绍GO的GUI库Fyne时,提到Fyne的数据绑定用到了监听器模式。本文就展开说下我对Go中监听器模式的理解和应用吧。监听器模式简介监听器模式,或称观察者模式,它主要涉及......
  • 10/3/2024 随笔
    很好两个月没更所以还是不按照之前的模板更了,要花太多时间qwq明天开学了…练习这一个月里进步很大!有好好的去练习假期前大概在黄题水平,现在可以做到绿题了!线段树真是个神奇的东东wwwdp还是一样弱…不知道该如何练习…有去参考题解尝试了APIO2023cyberland可是还是没......