适配器模式
1.定义:
让原来不兼容的两个接口协同工作
2.分类:类适配器、对象适配器
3.角色:
- 目标接口(Target),用户所需要的目标接口
- 被适配者(Adaptee),原先存在的接口,但不合目标接口兼容
- 适配器(Adapter),将被适配者和目标接口组合的类
应用场景:
- 想要使用现有的类,但这个类的接口不符合系统需要
- 通过接口转换,将一个类插入到另一个类系中
实例:对于一个平面上的点,我们有一个已经存在的类(Binaryplane)进行表示,类中有用于计算原点到该点模值平方的方法,如果目标接口要计算原点到该点模值,我们可以写一个适配器进行转换。
首先写一个目标接口
public interface Target
{
public double getModel();
}
被适配类Binaryplane
public class Binaryplane
{
protected double xvalue, yvalue;
public void setvalue(double xvalue, double yvalue)
{
this.xvalue = xvalue;
this.yvalue = yvalue;
}
public double getsquareModel()
{
return (xvalue * xvalue + yvalue * yvalue);
}
}
适配器类
public class Adapter: Binaryplane,Target
{
public double getModel()
{
return System.Math.Sqrt(base.getsquareModel());
}
}
测试类
public class test
{
static void Main(string[] args)
{
double model;
Adapter point1 = new Adapter();
point1.setvalue(3.0, 4.0);
model= point1.getModel();
Console.WriteLine("model:{0}", model);
}
}
运行结果:
model:5
在这个例子中,Adapter类实现了Target接口,继承了Binaryplane类,在适配器这个类的内部实现了从已有的类方法到目标接口的转化,并没有对原先的系统进行很大的改动,仅添加了一个适配器,就可以使原先没有关系的类协同工作。
访问者模式
1.定义:主要将数据结构与数据操作分离。
2.角色:
- Visitor:接口或抽象类,定义了对每个元素的访问
- ConcreteVisitor:具体的访问者,实现接口或抽象类的实体,给出访问元素时的具体行为
- Element:元素接口或抽象类,里面定义了接受访问者(accept)的方法
- ElementA,ElementB:具体的元素类,提供了接受访问的具体实现
应用场景:对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。
Visit接口
public interface Visitor
{
void visit(Student student);
void visit(Teacher teacher);
}
元素抽象类
public abstract class inSchool
{
public String name;
public abstract void accept(Visitor visitor);
}
访问者实现1
public class ManagerVisitor : Visitor
{public void visit(Teacher teacher)
{
Console.WriteLine("MANGAER----教师:{0}", teacher.name);
}
public void visit(Student student)
{
Console.WriteLine("MANAGER----学生:{0}+grades:{1}", student.name, student.examgrades);
}
}
访问者实现2
public class HeadmasterVisitor : Visitor
{
public void visit(Teacher teacher)
{
Console.WriteLine("HEADMASTER----教师:{0}+KPI:{1}", teacher.name, teacher.KPI);
}
public void visit(Student student)
{
Console.WriteLine("HEADMASTER----学生:grades:{0}", student.examgrades);
}
}
具体元素类1
public class Teacher:inSchool
{
public int KPI;
public Teacher(String name, int KPI)
{
base.name = name;
this.KPI = KPI;
}
public override void accept(Visitor visitor)
{
visitor.visit(this);
}
}
具体元素类2
public class Student : inSchool
{
public int examgrades;
public Student(String name, int KPI)
{
base.name = name;
this.examgrades = KPI;
}
public override void accept(Visitor visitor)
{
visitor.visit(this);
}
}
测试类
public class test
{
static void Main(string[] args)
{
inSchool teacher = new Teacher("wang",6);
inSchool student = new Student("zhou",1);
Visitor manager = new ManagerVisitor();
Visitor headmaster = new HeadmasterVisitor();
teacher.accept(manager);
student.accept(manager);
teacher.accept(headmaster);
student.accept(headmaster);
}
}
运行结果