状态模式:
-
概述
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 -
解决的问题
主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。 -
模式中的角色
3.1 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。
3.2 抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。
3.3 具体状态(Concrete State):实现抽象状态定义的接口。
例子:不同场景间的切换
观察者模式:存在一个一对多的关系,一个东西状态发生变化会影响到其他东西发生变化时,我们就可以使用委托与事件来实现观察者模式,观察者模式可以让一个东西状态发生变化时会自动同步到其他东西上。
例子:热水器可以拆分为温度计,显示器,警报器,显示器和警报器可以监视温度计的温度而进行行动。比如说温度计达到了95度以上就会通知显示器显示和警报器发出警报。
namespace Delegate
{
public class Heater
{
private int temperature = 0;
public delegate void BoilHandle(int temp);//委托
public event BoilHandle BoilEvent;//委托的事件
public void BoilWater()
{
for (int i = 0; i <= 100; i++)
{
temperature = i;
if (temperature > 95)
{
if (BoilEvent != null)//通知所有事件
{
BoilEvent(temperature);
}
}
}
}
}
public class Alarm
{
public void MakeAlarm(int temp)
{
Console.WriteLine("Alarm,水开了:"+temp);
}
}
public class Display
{
public void DisplayTemp(int temp)
{
Console.WriteLine("Display,水开了:" + temp);
}
}
public class Program
{
static void Main()
{
Heater heater = new Heater();
Alarm alarm = new Alarm();
Display display = new Display();
heater.BoilEvent += alarm.MakeAlarm;//注册事件
heater.BoilEvent += display.DisplayTemp;//注册事件
heater.BoilWater();//调用通知事件。
}
}
}
外观模式:
例子:不同的人物去喝茶(很多喝茶的步骤:倒水,泡茶)
这个时候,我们可以定义一个接口来进行交互,这个接口相当于服务员,让服务员去处理喝茶的一些步骤,顾客就负责喝茶就可以了。
单例模式:
提供了唯一实例的受控访问,因为是唯一的实例,节约了系统资源。(在类内声明这个类的对象,然后通过类内接口去访问它,从而调用里面的方法)
中介者模式:
例子:同学,班长,团支书,学委等人的交流,如果它们直接交流的话会产生错综复杂的关系。
所以我们可以通过qq群作为中介,来实现它们之间的交流。
(与外观模式不同的是,本来它们之间是可以相互交流的,而外观模式是本来两种东西内部是没有交流的。)
桥接模式
把统一的功能提取出来,然后再组合。
策略模式
通过策略接口来切换不同的策略方案。