所以我的第一个问题是,如果我正确的话,您会将“接口”实现为一个类吗?
然后我的另一个问题是,您是否可以将外观模式与观察者模式一起使用。外观类将观察所有主题,然后控制应调用不同类中的哪些方法,具体取决于主题?
编辑:根据要求,我尝试使用外观模式为观察者模式创建示例项目,以下是结果:
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);
}
}
这让我想到,使用门面模式好像并没有太大的意义,因为门面模式的整个目的就是使客户端更容易使用(或隐藏信息),难道我错了吗?