设计模式园子里面很多的文章都写过,关于什么是设计模式以及设计模式用来做什么我就不再赘述了。这里就结合在工作中遇到的问题加以简化来说明为什么会需要用到适配器和工厂这两个模式,以及这两个模式组合使用的情况。
首先来直观的看一下简化过的类图,我会在后面做解释:
其中的单箭头表示引用,双箭头表示继承或者说实现。
在当时的情况下,我们已经有了一个老接口(IExtraAdapter)以及实现这个接口的两个类(SimpleExAdapter)和(ComplexExAdapter).现在的需求是定义了一个新的接口(IAdapter),这个接口跟老接口很相似(我在后面的代码里面简化了这个接口),但是不是统一接口。继承自这个接口的新类(UseAdapter)需要实现新的接口,这个新接口里面可以用到SimpleExAdapter或者ComplexExAdapter中已经实现的IExtraAdapter接口的方法。为了解决上述问题,我实现类图中的解决方法。下面是代码,看了代码应该很快会明白这两种模式的思想。
/////////////////////////////////////////////////////////
//老的接口
public interface IExtraAdapter
{
void openResource();
void closeResource();
void freeResource();
}
///////////////////////////////////////////////////////
//老接口的一种实现
public class SimpleExAdapter:IExtraAdapter
{
public void openResource()
{
Console.WriteLine("simple adapter has opened the resource");
}
public void closeResource()
{
Console.WriteLine("simple adapter has closed the resource");
}
public void freeResource()
{
Console.WriteLine("simple adapter has freed the resource");
}
}
////////////////////////////////////////////////////////////////
//老接口的另外一种实现
public class ComplexExAdapter:IExtraAdapter
{
public void openResource()
{
Console.WriteLine("complex adapter has opened the resource");
}
public void closeResource()
{
Console.WriteLine("complex adapter has closed the resource");
}
public void freeResource()
{
Console.WriteLine("complex adapter has freed the resource");
}
}
////////////////////////////////////////////////////////////////////////////
//老接口的实现工厂管理类
class Manager
{
//根据传入参数返回对应的工厂实例,用这种方法,我们就可以避免
//在每一个实现接口的方法里面都写很多的swith case 语句了。
public IExtraAdapter GetAdapter(string adapterType)
{
if (adapterType == "simple")
{
return new SimpleExAdapter();
}
else
{
return new ComplexExAdapter();
}
}
}
//////////////////////////////////////////////////////////////////////////////////
//新需求中的接口
public interface IAdapter
{
void NewOpenResource();
void NewColseResource();
void NewFreeResource();
}
//////////////////////////////////////////////////////////
//继承新接口的实现类
class UseAdapter:IAdapter
{
private IExtraAdapter exAdapter;//老接口
public UseAdapter(string adapterType)
{
//工厂返回老接口的一个实现实例
Manager manager=new Manager();
exAdapter = manager.GetAdapter(adapterType);
}
//下面三个实现新接口的方法,调用三个自定义方法
public void NewOpenResource()
{
this.openResource();
}
public void NewColseResource()
{
this.closeResource();
}
public void NewFreeResource()
{
this.freeResource();
}
//这三个自定义方法,在做一些新需求的额外操作以后,调用老接口的实现方法,
//完成了新老接口的适配
private void openResource()
{
Console.WriteLine("do some special task...");
exAdapter.openResource();
}
private void closeResource()
{
Console.WriteLine("do some special task...");
exAdapter.closeResource();
}
private void freeResource()
{
Console.WriteLine("do some special task...");
exAdapter.freeResource();
}
}
/////////////////////////////////////////////////////////////////////
class Program
{
static void Main(string[] args)
{
//实现了接口的实例的使用
IAdapter instance = new UseAdapter("simple");
instance.NewOpenResource();
instance.NewColseResource();
instance.NewFreeResource();
}
}
///////////////////////////////////////////////////////////////////////////
以上就是我简化了的各类的实现,仅供没有用过的兄弟参考,欢迎高手打击。