【发布时间】:2015-11-25 10:21:42
【问题描述】:
我接到了一项任务,要弄清楚外观模式到底是什么。我用谷歌搜索,发现它是为了通过制作一个“接口”来保护 client 免受非常复杂的系统的影响。所以我有几个问题,我在多个示例中看到他们为复杂系统创建了 C# 接口,但我也看到了一些使用 A 类作为“接口”的示例(如 here 所示)。如果它是一个基类,它可以简化对不同类的许多不同的复杂方法调用,我只能理解它(银行示例见here)
所以我的第一个问题是我是否正确,您将“接口”作为一个类来实现?
然后我的另一个问题是,你能将外观模式与观察者模式一起使用吗?门面类会观察所有的主题,然后根据主题控制不同类中的哪些方法应该被调用?
编辑:根据要求,我尝试为观察者模式制作一个带有外观的示例项目,结果如下:
public class Facade
{
private Dictionary<ISubject, List<IObserver>> Subjects { get; set; }
public Facade()
{
Subjects = new Dictionary<ISubject, List<IObserver>>();
}
public void AddObserverToSubject(ISubject sub,IObserver obs)
{
if (Subjects.ContainsKey(sub))
Subjects[sub].Add(obs);
else
{
List<IObserver> observers = new List<IObserver>();
observers.Add(obs);
Subjects.Add(sub, observers);
}
obs.Subject = sub;
}
public void DeleteObserverFromSubject(IObserver obs,ISubject subject)
{
Subjects[subject].Remove(obs);
}
public void Notify(ISubject subject)
{
foreach (var observer in Subjects[subject])
{
observer.Update();
}
}
}
public interface ISubject
{
Facade Observers { get; set; }
int GetState();
void SetState(int state);
}
public interface IObserver
{
ISubject Subject { get; set; }
void Update();
string Mood { get; }
}
因此每个观察者都会根据主题的情况更新他们的情绪。
我已经实现了 IObserver 和 ISubject 的两个实现,但我在这里只展示一个。
public class TeacherObserver : IObserver
{
public ISubject Subject { get; set; }
private int _currentSalery = 500;
public string Mood { get; private set; }
public TeacherObserver()
{
Mood = "Happy";
}
public void Update()
{
var newSalery = Subject.GetState();
if (_currentSalery < newSalery)
{
Mood = "Happy";
}
else
{
Mood = "Sad";
}
_currentSalery = newSalery;
}
}
public class SalerySubject :ISubject
{
public Facade Observers { get; set; }
private int _salery;
public int GetState()
{
return _salery;
}
public void SetState(int state)
{
_salery = state;
Observers.Notify(this);
}
}
所以我喜欢这个的一件事是主体不必知道绑定到它的所有观察者(这将由外观类现在处理)。但从客户的角度来看,这与他必须拨打的电话几乎相同:
class Program
{
static void Main(string[] args)
{
Facade.Facade observer = new Facade.Facade();
ISubject salery = new SalerySubject();
IObserver teacher = new TeacherObserver();
salery.Observers = observer;
observer.AddObserverToSubject(salery,teacher);
Console.WriteLine("Teacher is " + teacher.Mood);
salery.SetState(100);
Console.WriteLine("Teacher salery just went down. The teacher is now " + teacher.Mood);
}
}
- 这让我觉得用外观做这件事并没有什么意义,因为外观的全部意义在于让客户更容易,对吧? (或隐藏信息)还是我错了?
【问题讨论】:
标签: c# design-patterns