FacadePattern-HeadFirst学习

1、外观模式定义

提供了一个统一的接口,用来访问子系统中的一群接口,让子系统更容易使用。

2、要点

当需要用到一个现有的类而其接口不符合你的需要时,就使用适配器模式

当需要简化并统一一个很大的接口或一群复杂的接口时,使用外观模式

适配器改变接口以符合客户的期望

外观将客户从一个复杂的子系统中解耦

实现一个适配器可能需要一番功夫,也可能不费工夫,视目标接口的大小和复杂程度实现一个外观,需要将子系统组合进外观中,然后将工作委托给子系统执行

适配器模式有两种模式,对象适配器和类适配器,类适配器需要用到多重jicheng

可以为一个子系统实现一个以上的外观

适配器将一个对象包装起来以改变其接口,装饰者将一个对象包装起来以增加新的职责,而外观是将一群对象包装起来以简化其接口

3、例子代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FacadePattern
{
    /// <summary>
    /// 功放
    /// </summary>
    public class Tuner
    {
        public void on()
        {
            Console.WriteLine("Tuner_On");
        }

        public void off()
        {
            Console.WriteLine("Tuner_Off");
        }
    }

    /// <summary>
    /// DVD播放器
    /// </summary>
    public class DVDPlayer
    {
        public void on()
        {
            Console.WriteLine("DVDPlayer_On");
        }

        public void play()
        {
            Console.WriteLine("DVDPlayer_play");
        }
        public void off()
        {
            Console.WriteLine("DVDPlayer_Off");
        }
    }

    /// <summary>
    /// CD播放器
    /// </summary>
    public class CDPlayer
    {
        public void on()
        {
            Console.WriteLine("CDPlayer_On");
        }

        public void play()
        {
            Console.WriteLine("CDPlayer_play");
        }
        public void off()
        {
            Console.WriteLine("CDPlayer_Off");
        }
    }

    /// <summary>
    /// 投影仪
    /// </summary>
    public class Projector
    {
        public void on()
        {
            Console.WriteLine("Projector_On");
        }

        public void off()
        {
            Console.WriteLine("Projector_Off");
        }
    }

    /// <summary>
    /// 灯光
    /// </summary>
    public class TheaterLights
    {
        public void on()
        {
            Console.WriteLine("TheaterLights_On");
        }

        public void off()
        {
            Console.WriteLine("TheaterLights_Off");
        }
    }

    /// <summary>
    /// 屏幕
    /// </summary>
    public class Screen
    {
        public void up()
        {
            Console.WriteLine("Screen_Up");
        }

        public void down()
        {
            Console.WriteLine("Screen_Down");
        }
    }

    /// <summary>
    /// 爆米花机
    /// </summary>
    public class PopCornPopper
    {
        public void on()
        {
            Console.WriteLine("PopCornPopper_On");
        }

        public void pop()
        {
            Console.WriteLine("PopCornPopper_Pop");
        }
        public void off()
        {
            Console.WriteLine("PopCornPopper_Off");
        }
    }

    public class Amplifier
    {
        public void on()
        {
            Console.WriteLine("Amplifier_On");
        }

        public void off()
        {
            Console.WriteLine("Amplifier_Off");
        }

        public void setDVD()
        {
            Console.WriteLine("Amplifier_setDVD");
        }

        public void setCD()
        {
            Console.WriteLine("Amplifier_setCD");
        }

        public void setTuner()
        {
            Console.WriteLine("Amplifier_setTuner");
        }
    }

    /// <summary>
    /// 家庭影院
    /// </summary>
    public class HomeTheaterFacade
    {
        private Amplifier m_Amplifier;
        private Tuner m_Tuner;
        private DVDPlayer m_DVDPlayer;
        private CDPlayer m_CDPlayer;
        private Projector m_Projector;
        private TheaterLights m_Lights;
        private Screen m_Screen;
        private PopCornPopper m_PopCorn;

        public HomeTheaterFacade(Amplifier m_Amplifier, Tuner m_Tuner, DVDPlayer m_DVDPlayer, CDPlayer m_CDPlayer, Projector m_Projector,
            TheaterLights m_Lights, Screen m_Screen, PopCornPopper m_PopCorn)
        {
            this.m_Amplifier = m_Amplifier;
            this.m_CDPlayer = m_CDPlayer;
            this.m_DVDPlayer = m_DVDPlayer;
            this.m_Lights = m_Lights;
            this.m_PopCorn = m_PopCorn;
            this.m_Projector = m_Projector;
            this.m_Screen = m_Screen;
            this.m_Tuner = m_Tuner;
        }

        public void WatchMovie()
        {
            Console.WriteLine("Ready to Watch movie");
            m_PopCorn.on();
            m_PopCorn.pop();
            m_Lights.off();
            m_Screen.down();
            m_Projector.on();
            m_Amplifier.on();
            m_Amplifier.setDVD();
            m_DVDPlayer.on();
            m_DVDPlayer.play();
        }

        public void EndMovie()
        {
            Console.WriteLine("shutting down movie");
            m_PopCorn.off();
            m_Lights.on();
            m_Screen.up();
            m_Projector.off();
            m_Amplifier.off();
            m_DVDPlayer.off();
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FacadePattern
{
    class Program
    {
        static void Main(string[] args)
        {
            HomeTheaterFacade pHomeTheaterFacade = new HomeTheaterFacade
                (new Amplifier(), new Tuner(), new DVDPlayer(), new CDPlayer(), new Projector(),
                new TheaterLights(), new Screen(), new PopCornPopper());

            pHomeTheaterFacade.WatchMovie();
            pHomeTheaterFacade.EndMovie();
        }
    }
}

4、主要类图


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值