装饰模式 VS. 外观模式

本文探讨了装饰模式和外观模式的区别与应用场景。装饰模式用于动态地给对象添加额外职责,保持核心职责与装饰功能分离,适用于对象功能扩展的需求。外观模式则提供子系统的一致接口,降低客户端与子系统之间的耦合,方便使用。两种模式各有优点,适用于不同的设计需求。

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

 一、装饰模式

       小菜想要和MM约会需要给自己扮靓,而新入住房子之前也需要对每个房间装修一遍,这些事情都有一个共同的特点,就是一个词“装饰”,我们可以把装饰模式应用在这些事情上面。

       装饰模式:就是动态的给一个对象添加一些额外的职责或者是功能,装饰模式比生成子类更为灵活。是给已有功能动态的添加更多功能的一种方式。举一个装修房子例子来说明一下什么装饰模式. 

    //装饰模式
    //父类,所有房子的抽象类
    abstract class Building
    {
        public abstract void Spruce();
    }
    //要装饰的具体房子类,具体的对象,可以给这个对象添加一些职责
    class Room : Building
    {
        //房间编号
        private string name;
        public Room(string name)
        {
            this.name = name;
        }
        //对具体房间的装修
        public override void Spruce()
        {
            Console.WriteLine("房间{0}装修的设备有", name);
        }
    }
    //装饰物品,也属于房子,所以可以抽象成是房子的子类,同时也作为具体装饰物品的父类
    abstract class Decorator : Building
    {
        protected Building building;
        public void SetBuliding(Building building)
        {
            this.building = building;
        }
        //装修
        public override void Spruce()
        {
            if (building != null)
            {
                building.Spruce();
            }
        }

    }

    //家具
    class Furniture : Decorator
    {
        public override void Spruce()
        {
            Console.WriteLine("     家具");
        }
    }
    //电器
    class Elecobject : Decorator
    {
        public override void Spruce()
        {
            Console.WriteLine("     家用电器");
        }
    }
    //娱乐设施
    class Entertainment : Decorator
    {
        public override void Spruce()
        {
            Console.WriteLine("     娱乐设施");
        }
    }
    //运动设施
    class Sports : Decorator
    {
        public override void Spruce()
        {
            Console.WriteLine("     运动设施");
        }
    }

客户端:

            Building room1 = new Room("room1");
            Furniture furniture1 = new Furniture();
            Elecobject elec = new Elecobject();
            Entertainment enter = new Entertainment();
            Sports sport = new Sports();

            room1.Spruce();
            furniture1.Spruce();
            elec.Spruce();
            enter.Spruce();
            sport.Spruce();

            Console.Read();

         装饰模式的优点:

(1)就是把类中的装饰功能从类中搬移去除,这样可以简化原有的类,有效的把类的核心职责和装饰功能区分开了。

(2)通过使用不同的具体装饰类以及这些装饰类的排列组合,设计者可以创造出很多不同行为的组合。


        装修房间与人的装扮不同,可以没有先后顺序,因为房间内的空间是一定的,装修的家具、电器可以没有先后顺序的放入房间。当有一些家具以后,开可以根据喜好再动态的添加自己喜好的家具,电器等等。


       适合装饰者应用场合:

1、当我们需要为某个现有的对象动态的增加一个新的功能或指责时,可以考虑使用装饰模式。

2、当某个对象的指责经常发生变化或者经常需要动态的增加指责,避免为了适应这样的变化,而增加继承子类扩展的方式,因为这种方式会造成子类膨胀的速度过快,难以控制。

 

        五月天有一首歌这样唱道:学长要想把妹子要会弹吉他,T1213121……,如今小菜说,学长不仅要回弹吉他还要学会装饰模式……

 

   装饰模式是某样东西的内容的附加,从而得到新的东西,而外观模式是对一系列的接口进行封装。这就引出了另一个设计模式——外观模式。  

       

二、外观模式 

        外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

    例如,使用开关的例子。

    //外观模式
    //外观类,开关外观
    class SwithFacade
    {
        Light light;
        Fan fan;
        Telivision telivision;
        AirConditioner airconditioner;

        public SwithFacade()
        {
            light = new Light();
            fan = new Fan();
            telivision = new Telivision();
            airconditioner = new AirConditioner();
        }
        public void Turnon()
        {
            Console.WriteLine("进门打开");
            light.Turnon();
            telivision.Turnon();
        }
        public void Turnoff()
        {
            Console.WriteLine("出门要记得关闭:");
            light.Turnoff();
            telivision.Turnoff();
            airconditioner.Turnoff();
            fan.Turnoff();
        }
    }
    //子系统类
    //电灯类
    class Light
    {
        public void Turnon()
        {
            Console.WriteLine("电灯打开");
        }
        public void Turnoff()
        {
            Console.WriteLine("电灯关闭");
        }
    }
    //电风扇类
    class Fan

    //电视类
  
    //空调类
    class AirConditioner
客户端:

            SwithFacade facade = new SwithFacade();
            facade.Turnon();
            facade.Turnoff();
            Console.Read();

   外观模式的优点是:

(1)将客户端与具体的子系统实现分隔开,提高了子系统的独立性和可移植性。

(2)实现子系统与客户的松耦合性,使得子系统的组件变化不会影响到调用它的客户类,只需调整外观类即可。

(3)只提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。


三、装饰模式 VS.外观模式

    装饰模式:封装一个对象,并提供额外的行为,用组合的方式来替代继承以扩展类的功能。 

    外观模式:封装许多对象,以简化它们的接口,此模式定义了一个高层的接口,这个接口使得这一子系统更加容易使用



评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值