设计模式之读写装饰

Posted 思想决定一切

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之读写装饰相关的知识,希望对你有一定的参考价值。

今天有人问我如下代码:

1 public class UserInformation
2     {
3         public string Name { get; set; }
4 
5         public uint Age { get; internal set; }
6     }

UserInformation.Age 这个代码在A程序集里面可以,但是在B程序集里面却无法使用了,如何解决?

其实这个问题本质跟设计模式有关系,internal 在C#中是程序集内可访问的修饰符.  

因此我想到了第一种方案:

 1 public class UserInformation
 2     {
 3         public string Name { get; internal set; }
 4 
 5         public uint Age { get; set; }
 6 
 7         public void SetName(string name)
 8         {
 9             Name = name;
10         }
11     }

有点儿Java的风格,并不喜欢。考虑了第二中方案:

 
 1 public interface IInformation
 2     {
 3         string Name { get; }
 4 
 5         uint Age { get; }
 6     }
 7 
 8     public interface IMutableInformation : IInformation
 9     {
10         new string Name { set; }
11 
12         new uint Age { set; }
13     }

那么,实体类的实现如下:

 1  public class UserInformation : IInformation , IMutableInformation
 2     {
 3         private string _Name = string.Empty;
 4         private uint _Age = default(uint);
 5 
 6         public string Name { get { return _Name; } }
 7 
 8         public uint Age { get { return _Age; } }
 9 
10         string IMutableInformation.Name
11         {
12             set { _Name = value; }
13         }
14 
15         uint IMutableInformation.Age
16         {
17             set { _Age = value; }
18         }
19     }

下面,我就开始调用它了:

 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5 
 6             A.UserInformation information = new A.UserInformation();
 7             A.IMutableInformation mutableInformation = information;
 8             mutableInformation.Name = "张三丰";
 9             mutableInformation.Age = 102;
10 
11             Console.WriteLine(information.Name);
12             Console.WriteLine(information.Age);
13 
14             // information.Name = "张三丰"; // 这样,此处编译的时候会出错,你需要用【IMutableInformation】接口 给【A.UserInformation】赋值.
15 
16             Console.ReadLine();
17         }
18     }

就介绍到这里了....

以上是关于设计模式之读写装饰的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之装饰模式(Decorator)详解及代码示例

设计模式之单例模式

Java设计模式之装饰者模式

编程模式之Go语言如何实现装饰器

设计模式之装饰者模式

设计模式之装饰者模式