/*
* 适配器模式:
*引入场景:由于应用环境的变化,常常需要将“一些现存的对象”放到新的环境中应用,但是,新的环境要求的接口是这些现存对象所不满足的。
* 意图:将一个类的接口转换为客户希望的另外一个接口。【也可以是组件的接口】
*
* 代码场景:适配器[Adapter]为:MyStack,适配对象[Adaptee]为ArrayList,接口标准[Target]为IStack。这样,我们就可以使得ArrayList遵循IStack标准使用。
*该场景是对象适配器的使用实例。
*
* 使用环境:希望能够复用一些现存的类,但是接口又和复用环境要求不一致。如:遗留代码复用、类库迁移。
*
* 要求我们尽量使用面向接口的编程,即直接调用接口,而不是具体类。
* 即:把MyStack类实现为实现IStack接口,这样,其他系统需要使用
*/
public interface IStack
{
void Push(object item);
object Pop();
object Peek();
}
public class MyStack : IStack
{
private ArrayList list;//组合方案,比继承好
public MyStack()
{
list = new ArrayList();
}
public void Push(object item)
{
list.Add(item);
}
public object Pop()
{
object obj = list[list.Count - 1];
list.RemoveAt(list.Count -1);
return obj;
}
public object Peek()
{
return list[list.Count-1];
}
}
/*
* 类适配器的使用实例:
* 实际使用情况很少,相当于多重继承。但是,由于不能对继承的方法进行控制,因此,所得到的类显得很乱。
* 不推荐使用,仅供了解。
*/
public class ArrayListTest
{
public ArrayList list;
public ArrayListTest()
{
list = new ArrayList();
}
//method
}
public class MyStack_Class: ArrayListTest,IStack
{
public MyStack_Class(ArrayListTest arrTest)
{
}
public void Push(object item)
{
list.Add(item);
}
public object Pop()
{
object obj = list[list.Count - 1];
list.RemoveAt(list.Count - 1);
return obj;
}
public object Peek()
{
return list[list.Count-1];
}
}
class Adapter
{
static void Main ()
{
MyStack myStack = new MyStack();
myStack.Push("abc");
//other operation
}
}