0

Head First 设计模式 - 复合模式

 1 year ago
source link: https://tuncle.blog/Ch%2012%20Compound%20Patterns/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Head First 设计模式 - 复合模式

发表于 2023-05-22
字数总计:454|阅读时长:2 分钟 | 阅读量:3

复合模式(Compound Pattern)是通过两个或以上的设计模式形成一个可以解决一般性问题的通用框架。

MVC 框架就是一种组合模式,ControllerView 之间使用了策略模式, View 中只存 Controller 的接口,进而达到可以随时切换不同 Controller 的目的。ModelView 之间使用了观察者模式,View 作为观察者,Model 作为被观察者,当 Model 的数据发生变化时,View 相应改变。而 View 本身使用了组合模式,比如按钮中可能存在子按钮,窗口中存在子窗口等等。

我们以音量调节作为一个最简的 MVC 框架示例。

public interface IVolumeObserver
{
void VolumeUpdated();
}
public interface IVolumeModel
{
int Volume { get; set; }
void RegisterObserver(IVolumeObserver observer);
void UnRegisterObserver(IVolumeObserver observer);
}
public interface IViewController
{
void VolumeUp();
void VolumeDown();
void SetVolume(int volume);
}
public class VolumeModel : IVolumeModel
{
private int volume = 0;
public int Volume
{
get { return volume; }
set
{
volume = value;
observersList.ForEach(observer => observer.VolumeUpdated());
}
}
private List<IVolumeObserver> observersList = null;

public VolumeModel()
{
observersList = new List<IVolumeObserver>();
}

public void RegisterObserver(IVolumeObserver observer)
{
observersList.Add(observer);
}

public void UnRegisterObserver(IVolumeObserver observer)
{
observersList.Remove(observer);
}
}
public class VolumeView : IVolumeObserver
{
private IViewController controller = null;
private IVolumeModel model = null;

public VolumeView(IViewController controller, IVolumeModel model)
{
this.controller = controller;
this.model = model;
this.model.RegisterObserver(this);
Console.WriteLine("View: volume init is " + model.Volume);
}

public void OnVolumeUpButtonClick()
{
controller.VolumeUp();
}

public void OnVolumeDownButtonClick()
{
controller.VolumeDown();
}

public void VolumeUpdated()
{
Console.WriteLine("View: volume updated " + model.Volume);
}

~VolumeView()
{
model.UnRegisterObserver(this);
}
}
public class VolumeController : IViewController
{
private VolumeModel model = null;
public VolumeController(VolumeModel model)
{
this.model = model;
}

public void SetVolume(int volume)
{
model.Volume = volume;
}

public void VolumeDown()
{
--model.Volume;
}

public void VolumeUp()
{
++model.Volume;
}
}

测试代码及结果

VolumeModel model = new VolumeModel();
VolumeView view = new VolumeView(new VolumeController(model), model);
view.OnVolumeUpButtonClick();
view.OnVolumeUpButtonClick();
view.OnVolumeDownButtonClick();

运行结果:

复合模式运行结果

复合模式运行结果

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK