- 浏览: 147752 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
august_000:
很有道理,我已经亲自测试过了:
public class ...
单例模式之线程安全解析 -
Chris_bing:
一个单例有这么多名堂,最后那个内部类的解决方案很有创意啊,受教 ...
单例模式之线程安全解析
来源:http://www.cnblogs.com/leoo2sk/archive/2008/04/11/1148236.html
这一篇将结合一个实例“移动存储设备模拟”来让大家对面向接口编程有个直观印象。
通过上一篇文章的讨论,我想各位朋友对“面接接口编程”有了一个大致的了解。那么在这一篇里,我们用一个例子,让各位对这个重要的编程思想有个直观的印象。为充分考虑到初学者,所以这个例子非常简单,望各位高手见谅。
问题的提出
定义:现在我们要开发一个应用,模拟移动存储设备的读写,即计算机与U盘、MP3、移动硬盘等设备进行数据交换。
上下文(环境):已知要实现U盘、MP3播放器、移动硬盘三种移动存储设备,要求计算机能同这三种设备进行数据交换,并且以后可能会有新的第三方的移动存储设备,所以计算机必须有扩展性,能与目前未知而以后可能会出现的存储设备进行数据交换。
各个存储设备间读、写的实现方法不同,U盘和移动硬盘只有这两个方法,MP3Player还有一个PlayMusic方法。
名词定义:数据交换={读,写}
看到上面的问题,我想各位脑子中一定有了不少想法,这是个很好解决的问题,很多方案都能达到效果。下面,我列举几个典型的方案。
解决方案列举
方案一:分别定义FlashDisk、MP3Player、MobileHardDisk三个类,实现各自的Read和Write方法。然后在Computer类中实例化上述三个类,为每个类分别写读、写方法。例如,为FlashDisk写ReadFromFlashDisk、WriteToFlashDisk两个方法。总共六个方法。
方案二:定义抽象类MobileStorage,在里面写虚方法Read和Write,三个存储设备继承此抽象类,并重写Read和Write方法。Computer类中包含一个类型为MobileStorage的成员变量,并为其编写get/set器,这样Computer中只需要两个方法:ReadData和WriteData,并通过多态性实现不同移动设备的读写。
方案三:与方案二基本相同,只是不定义抽象类,而是定义接口IMobileStorage,移动存储器类实现此接口。Computer中通过依赖接口IMobileStorage实现多态性。
方案四:定义接口IReadable和IWritable,两个接口分别只包含Read和Write,然后定义接口IMobileStorage接口继承自IReadable和IWritable,剩下的实现与方案三相同。
下面,我们来分析一下以上四种方案:
首先,方案一最直白,实现起来最简单,但是它有一个致命的弱点:可扩展性差。或者说,不符合“开放-关闭原则”(注:意为对扩展开放,对修改关闭)。当将来有了第三方扩展移动存储设备时,必须对Computer进行修改。这就如在一个真实的计算机上,为每一种移动存储设备实现一个不同的插口、并分别有各自的驱动程序。当有了一种新的移动存储设备后,我们就要将计算机大卸八块,然后增加一个新的插口,在编写一套针对此新设备的驱动程序。这种设计显然不可取。
此方案的另一个缺点在于,冗余代码多。如果有100种移动存储,那我们的Computer中岂不是要至少写200个方法,这是不能接受的!
我们再来看方案二和方案三,之所以将这两个方案放在一起讨论,是因为他们基本是一个方案(从思想层面上来说),只不过实现手段不同,一个是使用了抽象类,一个是使用了接口,而且最终达到的目的应该是一样的。
我们先来评价这种方案:首先它解决了代码冗余的问题,因为可以动态替换移动设备,并且都实现了共同的接口,所以不管有多少种移动设备,只要一个Read方法和一个Write方法,多态性就帮我们解决问题了。而对第一个问题,由于可以运行时动态替换,而不必将移动存储类硬编码在Computer中,所以有了新的第三方设备,完全可以替换进去运行。这就是所谓的“依赖接口,而不是依赖与具体类”,不信你看看,Computer类只有一个MobileStorage类型或IMobileStorage类型的成员变量,至于这个变量具体是什么类型,它并不知道,这取决于我们在运行时给这个变量的赋值。如此一来,Computer和移动存储器类的耦合度大大下降。
那么这里该选抽象类还是接口呢?还记得第一篇文章我对抽象类和接口选择的建议吗?看动机。这里,我们的动机显然是实现多态性而不是为了代码复用,所以当然要用接口。
最后我们再来看一看方案四,它和方案三很类似,只是将“可读”和“可写”两个规则分别抽象成了接口,然后让IMobileStorage再继承它们。这样做,显然进一步提高了灵活性,但是,这有没有设计过度的嫌疑呢?我的观点是:这要看具体情况。如果我们的应用中可能会出现一些类,这些类只实现读方法或只实现写方法,如只读光盘,那么这样做也是可以的。如果我们知道以后出现的东西都是能读又能写的,那这两个接口就没有必要了。其实如果将只读设备的Write方法留空或抛出异常,也可以不要这两个接口。总之一句话:理论是死的,人是活的,一切从现实需要来,防止设计不足,也要防止设计过度。
在这里,我们姑且认为以后的移动存储都是能读又能写的,所以我们选方案三。
实现
下面,我们要将解决方案加以实现。我选择的语言是C#,但是在代码中不会用到C#特有的性质,所以使用其他语言的朋友一样可以参考。
首先编写IMobileStorage接口:
1namespace InterfaceExample
2{
3 public interface IMobileStorage
4 {
5 void Read();//从自身读数据
6 void Write();//将数据写入自身
7 }
8}
比较简单,只有两个方法,没什么好说的,接下来是三个移动存储设备的具体实现代码:
U盘
1namespace InterfaceExample
2{
3 public class FlashDisk : IMobileStorage
4 {
5 public void Read()
6 {
7 Console.WriteLine("Reading from FlashDisk……");
8 Console.WriteLine("Read finished!");
9 }
10
11 public void Write()
12 {
13 Console.WriteLine("Writing to FlashDisk……");
14 Console.WriteLine("Write finished!");
15 }
16 }
17}
MP3
1namespace InterfaceExample
2{
3 public class MP3Player : IMobileStorage
4 {
5 public void Read()
6 {
7 Console.WriteLine("Reading from MP3Player……");
8 Console.WriteLine("Read finished!");
9 }
10
11 public void Write()
12 {
13 Console.WriteLine("Writing to MP3Player……");
14 Console.WriteLine("Write finished!");
15 }
16
17 public void PlayMusic()
18 {
19 Console.WriteLine("Music is playing……");
20 }
21 }
22}
移动硬盘
1namespace InterfaceExample
2{
3 public class MobileHardDisk : IMobileStorage
4 {
5 public void Read()
6 {
7 Console.WriteLine("Reading from MobileHardDisk……");
8 Console.WriteLine("Read finished!");
9 }
10
11 public void Write()
12 {
13 Console.WriteLine("Writing to MobileHardDisk……");
14 Console.WriteLine("Write finished!");
15 }
16 }
17}
可以看到,它们都实现了IMobileStorage接口,并重写了各自不同的Read和Write方法。下面,我们来写Computer:
1namespace InterfaceExample
2{
3 public class Computer
4 {
5 private IMobileStorage _usbDrive;
6
7 public IMobileStorage UsbDrive
8 {
9 get
10 {
11 return this._usbDrive;
12 }
13 set
14 {
15 this._usbDrive = value;
16 }
17 }
18
19 public Computer()
20 {
21 }
22
23 public Computer(IMobileStorage usbDrive)
24 {
25 this.UsbDrive = usbDrive;
26 }
27
28 public void ReadData()
29 {
30 this._usbDrive.Read();
31 }
32
33 public void WriteData()
34 {
35 this._usbDrive.Write();
36 }
37 }
38}
其中的UsbDrive就是可替换的移动存储设备,之所以用这个名字,是为了让大家觉得直观,就像我们平常使用电脑上的USB插口插拔设备一样。
OK!下面我们来测试我们的“电脑”和“移动存储设备”是否工作正常。我是用的C#控制台程序,具体代码如下:
1namespace InterfaceExample
2{
3 class Program
4 {
5 static void Main(string[] args)
6 {
7 Computer computer = new Computer();
8 IMobileStorage mp3Player = new MP3Player();
9 IMobileStorage flashDisk = new FlashDisk();
10 IMobileStorage mobileHardDisk = new MobileHardDisk();
11
12 Console.WriteLine("I inserted my MP3 Player into my computer and copy some music to it:");
13 computer.UsbDrive = mp3Player;
14 computer.WriteData();
15 Console.WriteLine();
16
17 Console.WriteLine("Well,I also want to copy a great movie to my computer from a mobile hard disk:");
18 computer.UsbDrive = mobileHardDisk;
19 computer.ReadData();
20 Console.WriteLine();
21
22 Console.WriteLine("OK!I have to read some files from my flash disk and copy another file to it:");
23 computer.UsbDrive = flashDisk;
24 computer.ReadData();
25 computer.WriteData();
26 Console.ReadLine();
27 }
28 }
29}
现在编译、运行程序,如果没有问题,将看到如下运行结果:
好的,看来我们的系统工作良好。
后来……
刚过了一个星期,就有人送来了新的移动存储设备NewMobileStorage,让我测试能不能用,我微微一笑,心想这不是小菜一碟,让我们看看面向接口编程的威力吧!将测试程序修改成如下:
1namespace InterfaceExample
2{
3 class Program
4 {
5 static void Main(string[] args)
6 {
7 Computer computer = new Computer();
8 IMobileStorage newMobileStorage = new NewMobileStorage();
9
10 Console.WriteLine("Now,I am testing the new mobile storage:");
11 computer.UsbDrive = newMobileStorage;
12 computer.ReadData();
13 computer.WriteData();
14 Console.ReadLine();
15 }
16 }
17}
编译、运行、看结果:
哈哈,神奇吧,Computer一点都不用改动,就可以使新的设备正常运行。这就是所谓“对扩展开放,对修改关闭”。
又过了几天,有人通知我说又有一个叫SuperStorage的移动设备要接到我们的Computer上,我心想来吧,管你是“超级存储”还是“特级存储”,我的“面向接口编程大法”把你们统统搞定。
但是,当设备真的送来,我傻眼了,开发这个新设备的团队没有拿到我们的IMobileStorage接口,自然也没有遵照这个约定。这个设备的读、写方法不叫Read和Write,而是叫rd和wt,这下完了……不符合接口啊,插不上。但是,不要着急,我们回到现实来找找解决的办法。我们一起想想:如果你的Computer上只有USB接口,而有人拿来一个PS/2的鼠标要插上用,你该怎么办?想起来了吧,是不是有一种叫“PS/2-USB”转换器的东西?也叫适配器,可以进行不同接口的转换。对了!程序中也有转换器。
这里,我要引入一个设计模式,叫“Adapter”。它的作用就如现实中的适配器一样,把接口不一致的两个插件接合起来。由于本篇不是讲设计模式的,而且Adapter设计模式很好理解,所以我就不细讲了,先来看我设计的类图吧:
如图所示,虽然SuperStorage没有实现IMobileStorage,但我们定义了一个实现IMobileStorage的SuperStorageAdapter,它聚合了一个SuperStorage,并将rd和wt适配为Read和Write,SuperStorageAdapter的具体代码如下:
namespace InterfaceExample
{
public class SuperStorageAdapter : IMobileStorage
{
private SuperStorage _superStorage;
public SuperStorage SuperStorage
{
get
{
return this._superStorage;
}
set
{
this._superStorage = value;
}
}
public void Read()
{
this._superStorage.rd();
}
public void Write()
{
this._superStorage.wt();
}
}
}
好,现在我们来测试适配过的新设备,测试代码如下:
namespace InterfaceExample
{
class Program
{
static void Main(string[] args)
{
Computer computer = new Computer();
SuperStorageAdapter superStorageAdapter = new SuperStorageAdapter();
SuperStorage superStorage = new SuperStorage();
superStorageAdapter.SuperStorage = superStorage;
Console.WriteLine("Now,I am testing the new super storage with adapter:");
computer.UsbDrive = superStorageAdapter;
computer.ReadData();
computer.WriteData();
Console.ReadLine();
}
}
}
运行后会得到如下结果:
OK!虽然遇到了一些困难,不过在设计模式的帮助下,我们还是在没有修改Computer任何代码的情况下实现了新设备的运行。
好了,理论在第一篇讲得足够多了,所以这里我就不多讲了。希望各位朋友结合第一篇的理论和这个例子,仔细思考面向接口的问题。当然,不要忘了结合现实。
下一篇,我将解析经典设计模式中的面向接口编程思想和.NET平台分层架构中接口的运用。
这一篇将结合一个实例“移动存储设备模拟”来让大家对面向接口编程有个直观印象。
通过上一篇文章的讨论,我想各位朋友对“面接接口编程”有了一个大致的了解。那么在这一篇里,我们用一个例子,让各位对这个重要的编程思想有个直观的印象。为充分考虑到初学者,所以这个例子非常简单,望各位高手见谅。
问题的提出
定义:现在我们要开发一个应用,模拟移动存储设备的读写,即计算机与U盘、MP3、移动硬盘等设备进行数据交换。
上下文(环境):已知要实现U盘、MP3播放器、移动硬盘三种移动存储设备,要求计算机能同这三种设备进行数据交换,并且以后可能会有新的第三方的移动存储设备,所以计算机必须有扩展性,能与目前未知而以后可能会出现的存储设备进行数据交换。
各个存储设备间读、写的实现方法不同,U盘和移动硬盘只有这两个方法,MP3Player还有一个PlayMusic方法。
名词定义:数据交换={读,写}
看到上面的问题,我想各位脑子中一定有了不少想法,这是个很好解决的问题,很多方案都能达到效果。下面,我列举几个典型的方案。
解决方案列举
方案一:分别定义FlashDisk、MP3Player、MobileHardDisk三个类,实现各自的Read和Write方法。然后在Computer类中实例化上述三个类,为每个类分别写读、写方法。例如,为FlashDisk写ReadFromFlashDisk、WriteToFlashDisk两个方法。总共六个方法。
方案二:定义抽象类MobileStorage,在里面写虚方法Read和Write,三个存储设备继承此抽象类,并重写Read和Write方法。Computer类中包含一个类型为MobileStorage的成员变量,并为其编写get/set器,这样Computer中只需要两个方法:ReadData和WriteData,并通过多态性实现不同移动设备的读写。
方案三:与方案二基本相同,只是不定义抽象类,而是定义接口IMobileStorage,移动存储器类实现此接口。Computer中通过依赖接口IMobileStorage实现多态性。
方案四:定义接口IReadable和IWritable,两个接口分别只包含Read和Write,然后定义接口IMobileStorage接口继承自IReadable和IWritable,剩下的实现与方案三相同。
下面,我们来分析一下以上四种方案:
首先,方案一最直白,实现起来最简单,但是它有一个致命的弱点:可扩展性差。或者说,不符合“开放-关闭原则”(注:意为对扩展开放,对修改关闭)。当将来有了第三方扩展移动存储设备时,必须对Computer进行修改。这就如在一个真实的计算机上,为每一种移动存储设备实现一个不同的插口、并分别有各自的驱动程序。当有了一种新的移动存储设备后,我们就要将计算机大卸八块,然后增加一个新的插口,在编写一套针对此新设备的驱动程序。这种设计显然不可取。
此方案的另一个缺点在于,冗余代码多。如果有100种移动存储,那我们的Computer中岂不是要至少写200个方法,这是不能接受的!
我们再来看方案二和方案三,之所以将这两个方案放在一起讨论,是因为他们基本是一个方案(从思想层面上来说),只不过实现手段不同,一个是使用了抽象类,一个是使用了接口,而且最终达到的目的应该是一样的。
我们先来评价这种方案:首先它解决了代码冗余的问题,因为可以动态替换移动设备,并且都实现了共同的接口,所以不管有多少种移动设备,只要一个Read方法和一个Write方法,多态性就帮我们解决问题了。而对第一个问题,由于可以运行时动态替换,而不必将移动存储类硬编码在Computer中,所以有了新的第三方设备,完全可以替换进去运行。这就是所谓的“依赖接口,而不是依赖与具体类”,不信你看看,Computer类只有一个MobileStorage类型或IMobileStorage类型的成员变量,至于这个变量具体是什么类型,它并不知道,这取决于我们在运行时给这个变量的赋值。如此一来,Computer和移动存储器类的耦合度大大下降。
那么这里该选抽象类还是接口呢?还记得第一篇文章我对抽象类和接口选择的建议吗?看动机。这里,我们的动机显然是实现多态性而不是为了代码复用,所以当然要用接口。
最后我们再来看一看方案四,它和方案三很类似,只是将“可读”和“可写”两个规则分别抽象成了接口,然后让IMobileStorage再继承它们。这样做,显然进一步提高了灵活性,但是,这有没有设计过度的嫌疑呢?我的观点是:这要看具体情况。如果我们的应用中可能会出现一些类,这些类只实现读方法或只实现写方法,如只读光盘,那么这样做也是可以的。如果我们知道以后出现的东西都是能读又能写的,那这两个接口就没有必要了。其实如果将只读设备的Write方法留空或抛出异常,也可以不要这两个接口。总之一句话:理论是死的,人是活的,一切从现实需要来,防止设计不足,也要防止设计过度。
在这里,我们姑且认为以后的移动存储都是能读又能写的,所以我们选方案三。
实现
下面,我们要将解决方案加以实现。我选择的语言是C#,但是在代码中不会用到C#特有的性质,所以使用其他语言的朋友一样可以参考。
首先编写IMobileStorage接口:
1namespace InterfaceExample
2{
3 public interface IMobileStorage
4 {
5 void Read();//从自身读数据
6 void Write();//将数据写入自身
7 }
8}
比较简单,只有两个方法,没什么好说的,接下来是三个移动存储设备的具体实现代码:
U盘
1namespace InterfaceExample
2{
3 public class FlashDisk : IMobileStorage
4 {
5 public void Read()
6 {
7 Console.WriteLine("Reading from FlashDisk……");
8 Console.WriteLine("Read finished!");
9 }
10
11 public void Write()
12 {
13 Console.WriteLine("Writing to FlashDisk……");
14 Console.WriteLine("Write finished!");
15 }
16 }
17}
MP3
1namespace InterfaceExample
2{
3 public class MP3Player : IMobileStorage
4 {
5 public void Read()
6 {
7 Console.WriteLine("Reading from MP3Player……");
8 Console.WriteLine("Read finished!");
9 }
10
11 public void Write()
12 {
13 Console.WriteLine("Writing to MP3Player……");
14 Console.WriteLine("Write finished!");
15 }
16
17 public void PlayMusic()
18 {
19 Console.WriteLine("Music is playing……");
20 }
21 }
22}
移动硬盘
1namespace InterfaceExample
2{
3 public class MobileHardDisk : IMobileStorage
4 {
5 public void Read()
6 {
7 Console.WriteLine("Reading from MobileHardDisk……");
8 Console.WriteLine("Read finished!");
9 }
10
11 public void Write()
12 {
13 Console.WriteLine("Writing to MobileHardDisk……");
14 Console.WriteLine("Write finished!");
15 }
16 }
17}
可以看到,它们都实现了IMobileStorage接口,并重写了各自不同的Read和Write方法。下面,我们来写Computer:
1namespace InterfaceExample
2{
3 public class Computer
4 {
5 private IMobileStorage _usbDrive;
6
7 public IMobileStorage UsbDrive
8 {
9 get
10 {
11 return this._usbDrive;
12 }
13 set
14 {
15 this._usbDrive = value;
16 }
17 }
18
19 public Computer()
20 {
21 }
22
23 public Computer(IMobileStorage usbDrive)
24 {
25 this.UsbDrive = usbDrive;
26 }
27
28 public void ReadData()
29 {
30 this._usbDrive.Read();
31 }
32
33 public void WriteData()
34 {
35 this._usbDrive.Write();
36 }
37 }
38}
其中的UsbDrive就是可替换的移动存储设备,之所以用这个名字,是为了让大家觉得直观,就像我们平常使用电脑上的USB插口插拔设备一样。
OK!下面我们来测试我们的“电脑”和“移动存储设备”是否工作正常。我是用的C#控制台程序,具体代码如下:
1namespace InterfaceExample
2{
3 class Program
4 {
5 static void Main(string[] args)
6 {
7 Computer computer = new Computer();
8 IMobileStorage mp3Player = new MP3Player();
9 IMobileStorage flashDisk = new FlashDisk();
10 IMobileStorage mobileHardDisk = new MobileHardDisk();
11
12 Console.WriteLine("I inserted my MP3 Player into my computer and copy some music to it:");
13 computer.UsbDrive = mp3Player;
14 computer.WriteData();
15 Console.WriteLine();
16
17 Console.WriteLine("Well,I also want to copy a great movie to my computer from a mobile hard disk:");
18 computer.UsbDrive = mobileHardDisk;
19 computer.ReadData();
20 Console.WriteLine();
21
22 Console.WriteLine("OK!I have to read some files from my flash disk and copy another file to it:");
23 computer.UsbDrive = flashDisk;
24 computer.ReadData();
25 computer.WriteData();
26 Console.ReadLine();
27 }
28 }
29}
现在编译、运行程序,如果没有问题,将看到如下运行结果:
好的,看来我们的系统工作良好。
后来……
刚过了一个星期,就有人送来了新的移动存储设备NewMobileStorage,让我测试能不能用,我微微一笑,心想这不是小菜一碟,让我们看看面向接口编程的威力吧!将测试程序修改成如下:
1namespace InterfaceExample
2{
3 class Program
4 {
5 static void Main(string[] args)
6 {
7 Computer computer = new Computer();
8 IMobileStorage newMobileStorage = new NewMobileStorage();
9
10 Console.WriteLine("Now,I am testing the new mobile storage:");
11 computer.UsbDrive = newMobileStorage;
12 computer.ReadData();
13 computer.WriteData();
14 Console.ReadLine();
15 }
16 }
17}
编译、运行、看结果:
哈哈,神奇吧,Computer一点都不用改动,就可以使新的设备正常运行。这就是所谓“对扩展开放,对修改关闭”。
又过了几天,有人通知我说又有一个叫SuperStorage的移动设备要接到我们的Computer上,我心想来吧,管你是“超级存储”还是“特级存储”,我的“面向接口编程大法”把你们统统搞定。
但是,当设备真的送来,我傻眼了,开发这个新设备的团队没有拿到我们的IMobileStorage接口,自然也没有遵照这个约定。这个设备的读、写方法不叫Read和Write,而是叫rd和wt,这下完了……不符合接口啊,插不上。但是,不要着急,我们回到现实来找找解决的办法。我们一起想想:如果你的Computer上只有USB接口,而有人拿来一个PS/2的鼠标要插上用,你该怎么办?想起来了吧,是不是有一种叫“PS/2-USB”转换器的东西?也叫适配器,可以进行不同接口的转换。对了!程序中也有转换器。
这里,我要引入一个设计模式,叫“Adapter”。它的作用就如现实中的适配器一样,把接口不一致的两个插件接合起来。由于本篇不是讲设计模式的,而且Adapter设计模式很好理解,所以我就不细讲了,先来看我设计的类图吧:
如图所示,虽然SuperStorage没有实现IMobileStorage,但我们定义了一个实现IMobileStorage的SuperStorageAdapter,它聚合了一个SuperStorage,并将rd和wt适配为Read和Write,SuperStorageAdapter的具体代码如下:
namespace InterfaceExample
{
public class SuperStorageAdapter : IMobileStorage
{
private SuperStorage _superStorage;
public SuperStorage SuperStorage
{
get
{
return this._superStorage;
}
set
{
this._superStorage = value;
}
}
public void Read()
{
this._superStorage.rd();
}
public void Write()
{
this._superStorage.wt();
}
}
}
好,现在我们来测试适配过的新设备,测试代码如下:
namespace InterfaceExample
{
class Program
{
static void Main(string[] args)
{
Computer computer = new Computer();
SuperStorageAdapter superStorageAdapter = new SuperStorageAdapter();
SuperStorage superStorage = new SuperStorage();
superStorageAdapter.SuperStorage = superStorage;
Console.WriteLine("Now,I am testing the new super storage with adapter:");
computer.UsbDrive = superStorageAdapter;
computer.ReadData();
computer.WriteData();
Console.ReadLine();
}
}
}
运行后会得到如下结果:
OK!虽然遇到了一些困难,不过在设计模式的帮助下,我们还是在没有修改Computer任何代码的情况下实现了新设备的运行。
好了,理论在第一篇讲得足够多了,所以这里我就不多讲了。希望各位朋友结合第一篇的理论和这个例子,仔细思考面向接口的问题。当然,不要忘了结合现实。
下一篇,我将解析经典设计模式中的面向接口编程思想和.NET平台分层架构中接口的运用。
发表评论
-
(转)重述——组合/聚合复用原则
2013-10-30 09:10 1059组合/聚合复用原则(Com ... -
(转)重述——迪米特法则
2013-10-29 10:51 1275迪米特法则(Law of Demeter) 又叫最 ... -
(转)重述——依赖倒置原则
2013-10-29 10:50 815依赖倒置原则(Dependence Inversion Pri ... -
(转)重述——里氏替换原则
2013-10-29 10:46 1449里氏替换原则(Liskov Substitution Prin ... -
(转)重述——开放封闭原则
2013-10-29 10:41 811开发封闭原则(Open-Closed Principle OC ... -
(转)重述——单一职责原则
2013-10-29 10:37 838单一职责原则(Single Respo ... -
(转)Java之美[从菜鸟到高手演变]系列之博文阅读导航
2013-10-28 17:00 1730Java之美[从菜鸟到高手演变]系列之博文阅读导航 http: ... -
(转)面向接口编程详解
2013-10-25 12:34 5老文章,自己学习。 面向接口编程详解(一) http://w ... -
(转)细说业务逻辑
2013-10-25 12:30 549前篇 http://www.cnblogs.com/leoo2 ... -
Java 多线程并发控制框架(转)
2012-12-14 11:28 1207Java 提供了语言级 ... -
(转)设计模式综述
2012-11-02 13:29 806设计模式主要分三个类 ... -
(转)面向接口编程详解(三)
2012-10-28 12:55 892讲解几个设计模式 ... -
(转)面向接口编程详解(一)
2012-10-28 12:50 781在这一篇中,将对接口及面向接口编程有个大致的介绍,着重在 ... -
面向对象的3个基本要素和5个基本设计原则(整理)
2012-10-24 23:20 13292面向对象的3个基本要素 ... -
进程与线程
2012-10-23 15:48 914简单来说, 进程是应用程序的一次执行,是具有一定独立功能的程序 ... -
单例模式之线程安全解析
2012-10-17 16:07 1959本文综合网上资料以及代码时间,对要求延迟加载和线程安全 ... -
反面模式(Anti-pattern)
2012-10-17 11:02 2919原文:http://en.wikipedia.or ... -
如何高效地阅读技术类书籍与博客
2012-10-04 16:39 950原文地址:http://www.nowam ... -
面经:面试官会关注你的哪些能力
2012-10-03 21:47 805原文地址:http://www.nowam ... -
阅读思维训练书籍
2012-10-03 21:44 1021原文地址:http://www.nowamagic.net/l ...
相关推荐
面向接口编程详解(二)——编程实例 面向接口编程是一种编程思想,强调通过接口来实现多态性和可扩展性。在本文中,我们将通过一个实例来详细解释面向接口编程的思想和优点。 问题提出:我们要开发一个应用,模拟...
面向接口编程是一种重要的软件设计原则,它强调程序的组件应通过接口进行交互,而不是直接依赖于具体的实现。这种编程范式有助于提高代码的灵活性、可维护性和可测试性。下面我们将详细探讨面向接口编程的思想基础、...
面向接口编程详解.chm面向接口编程详解.chm面向接口编程详解.chm
面向接口编程是一种编程范式,它基于面向对象编程的思想,但更强调通过接口来定义对象的行为,而不是具体实现。接口在这里扮演着规范和契约的角色,定义了一组方法签名,但不包含任何实现代码。这种编程方式允许代码...
面向接口编程是一种编程范式,它是面向对象编程(OOP)的一个重要组成部分,而非独立的编程思想。在面向接口编程中,我们关注的是定义清晰、明确的行为规范,而不是具体的实现细节。接口作为一种契约,规定了类必须...
面向接口编程是面向对象编程中的一个重要概念,它并非与面向对象编程平级,而是面向对象思想的精华之一。本文将详细解释面向接口编程的思想基础。 首先,我们需要理解接口的定义和本质。接口在编程中是一个包含一...
面向接口编程是一种重要的软件设计原则,它强调程序的组件应通过接口进行交互,而不是直接依赖于具体的实现。在本文档的第三部分,作者探讨了如何在实际的模式中运用这一原则,通过分析MVC(Model-View-Controller)...
面向接口编程是软件工程中的一种重要设计理念,尤其在面向对象编程中扮演着核心角色。它不仅深化了面向对象思想的应用,而且为构建更加灵活、可扩展和可维护的软件系统提供了理论依据。本文旨在深入探讨面向接口编程...
### 面向接口编程详解 #### 一、面向接口编程与面向对象编程的关系 面向接口编程并非一种独立于面向对象编程之外的新编程思想,而是面向对象编程思想体系中的一个重要组成部分。面向对象编程的核心在于模拟现实...
"Java面向对象编程实例详解2.txt"和"Java面向对象编程实例详解.txt"可能包含了详细的讲解和示例代码,涵盖了类的创建、对象的实例化、访问控制、构造函数、抽象类和接口、异常处理、集合框架等方面的知识。...
Java编程详解是一个深入探讨Java语言及其应用的领域,特别是针对最新的Java版本。在这个最新的Java编程详解中,我们可能涵盖了许多现代Java开发的关键知识点,包括但不限于以下几个方面: 1. **Java语言基础**:从...
《Java2编程详解》这本书是Java开发者的重要参考资料,它涵盖了Java语言的核心概念和技术,旨在帮助读者深入理解并熟练掌握Java2平台的编程技术。在这个压缩包中,包含了一个名为"Java2编程详解.pdf"的PDF文件,这很...
面向对象编程是Python的核心特性之一,它通过模拟现实世界的实体和关系来构建代码结构。本文主要探讨了Python中面向对象编程的基本概念、特点以及如何在实际应用中进行类和对象的创建。 首先,面向对象编程(OOP)...
2. **面向对象编程**:Java是一种纯面向对象的语言,书中会详细介绍类、对象、封装、继承和多态等概念,以及如何设计和实现接口,这对于理解Java的编程模型至关重要。 3. **异常处理**:Java中的异常处理机制是一个...
根据提供的信息,《java编程详解》是一本被广泛推荐并深受读者喜爱的专业书籍,它旨在为初学者和进阶学习者提供全面、深入的Java编程知识。以下是对该书可能涵盖的一些核心知识点的概述: ### Java语言基础 1. **...
《Java2编程详解》这本书是Java编程领域的一部经典之作,特别版的使用指南深入剖析了Java 2平台的核心技术和编程方法。这本书旨在帮助开发者掌握Java语言的基础以及高级特性,从而能够有效地进行软件开发。 首先,...