所以我们需要使用接口分离实现。代码如下:
- /// <summary> /// 柜台类也就是具体类提供的功能规则
- /// </summary>
- public interface ICounter
- {
- void ActivationCard(Card card);
- }
- /// <summary> /// 热心肠的老李
- /// </summary>
- public class MrLi : ICounter
- {
- //激活工卡方法
- public void ActivationCard(Card card)
- {
- Counter.Instance.ActivationCard(card);
- }
- }
- /// <summary> /// 柜台类
- /// </summary>
- public sealed class Counter : ICounter
- {
- //在第一次调用类成员时,初始化唯一实例
- private static readonly Counter instance = new Counter();
- private Counter()
- {
- }
- //返回类型实例属性
- public static Counter Instance
- {
- get
- {
- return instance;
- }
- }
- //激活工卡方法
- public void ActivationCard(Card card)
- {
- //激活工卡的过程
- Console.WriteLine("{0}的工卡激活成功!",card.CardName);
- }
- }
- /// <summary> /// 新的柜台类
- /// </summary>
- public sealed class NewCounter : ICounter
- {
- //在第一次调用类成员时,初始化唯一实例
- private static readonly NewCounter instance = new NewCounter();
- private NewCounter()
- {
- }
- //返回类型实例属性
- public static NewCounter Instance
- {
- get
- {
- return instance;
- }
- }
- //激活工卡方法
- public void ActivationCard(Card card)
- {
- //激活工卡的过程
- Console.WriteLine("{0}的工卡激活成功!", card.CardName);
- }
- }
有了接口的约束,所有柜台类都遵循了这个约束将激活卡片的方法统一成(ActivationCard),那么在将来切换对象的时候都可以以一种统一的调用方式去无缝的却换。
这时细心的朋友还会说,Mr.Li的ActivationCard方法中调用的是具体的counter类型如果换成Newcounter,还是要去修改它的代码,你现在只能是不用去修改调用方法了而已,想的好,还记得我们当时的工厂模式吗?它的好处不就是降低耦合吗?为什么不用?
那么加入工厂类(CounterProvider),在修改一下MrLi的调用使它的调用依赖于抽象接口而不是具体的实现,代码如下:
- /// <summary> /// 热心肠的老李
- /// </summary>
- public class MrLi : ICounter
- {
- //激活工卡方法
- public void ActivationCard(Card card)
- {
- ICounter counter = CounterProvider.GetCounter();
- counter.ActivationCard(card);
- }
- }
- /// <summary> /// 柜台类工厂
- /// </summary>
- public class CounterProvider
- {
- public static ICounter GetCounter()
- {
- ICounter counter = null
- //从配置文件确定实例化那个柜台类
- if (ReadConfig)
- {
- counter = Counter.Instance;
- }
- else
- {
- counter = NewCounter.Instance;
- }
- }
- }
这