文章目录
1. 需求
假如有一名男生卓贾易和一名女生娇娇,现在卓贾易直接追娇娇。用代码实现上述过程
2. 代码版本1.0
2.1 追求者类
//追求者类
class Pursuit {
private SchoolGirl mm;
public Pursuit(SchoolGirl mm){
this.mm = mm;
}
public void giveDolls(){
System.out.println(this.mm.getName()+",你好!送你洋娃娃。");
}
public void giveFlowers(){
System.out.println(this.mm.getName()+",你好!送你鲜花。");
}
public void giveChocolate(){
System.out.println(this.mm.getName()+",你好!送你巧克力。");
}
}
2.2 被追求者类
//被追求者类
class SchoolGirl{
private String name;
public String getName(){
return this.name;
}
public void setName(String value){
this.name = value;
}
}
2.3 客户端代码
public static void main(String[] args) {
SchoolGirl girlLjj = new SchoolGirl();
girlLjj.setName("李娇娇");
Pursuit boyZjy = new Pursuit(girlLjj);
boyZjy.giveChocolate();
boyZjy.giveDolls();
boyZjy.giveFlowers();
}
3. 增加需求
现在卓贾易要求戴励帮忙追求娇娇。这时候就需要用到代理模式。接下来介绍代理模式的案例代码。
4. 代理模式案例
4.1 概念
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。
4.2 UML类图
4.3 ISubject类
ISubject类,定义了RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。
在这里插入代码片
4.4 RealSubject类
RealSubject类,定义Proxy所代表的真实实体。
//RealSubject类
class RealSubject implements ISubject{
public void request(){
System.out.println("真实的请求。");
}
}
4.5 Proxy类
Proxy类,保存一个引用使得代理可以访问实体,并提供一个与Subject
的接口相同的方法,这样代理就可以用来替代实体。
//Proxy类
class Proxy implements ISubject{
private RealSubject rs;
public Proxy(){
this.rs = new RealSubject();
}
public void request(){
this.rs.request();
}
}
4.6 客户端代码
Proxy proxy = new Proxy();
proxy.request();
4.7 应用
- 远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
- 虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。这样就可以达到性能的最优化。
- 安全代理,用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。
- 智能指引,是指当调用真实的对象时,代理处理另外一些事。
5. 装饰模式实现
5.1 UML类图
5.2 送礼物接口
//送礼物接口
interface IGiveGift{
void giveDolls();
void giveFlowers();
void giveChocolate();
}
5.3 追求者类
追求者类只是增加了实现送礼物的接口一处改动。
//追求者类
class Pursuit implements IGiveGift{
private SchoolGirl mm;
public Pursuit(SchoolGirl mm){
this.mm = mm;
}
public void giveDolls(){
System.out.println(this.mm.getName()+",你好!送你洋娃娃。");
}
public void giveFlowers(){
System.out.println(this.mm.getName()+",你好!送你鲜花。");
}
public void giveChocolate(){
System.out.println(this.mm.getName()+",你好!送你巧克力。");
}
}
5.4 代理类
//代理类
class Proxy implements IGiveGift{
private Pursuit gg; //认识追求者
public Proxy(SchoolGirl mm){ //也认识被追求者
this.gg = new Pursuit(mm); //代理初始化的过程,实际是追求者的初始化过程
}
public void giveDolls(){
this.gg.giveDolls();
}
public void giveFlowers(){
this.gg.giveFlowers();
}
public void giveChocolate(){
this.gg.giveChocolate();
}
}
5.5 客户端
客户端如下,没有变化。但代理在被客户端调用自己的接口方法时,本质是调用了追求者同名方法。
SchoolGirl girlLjj = new SchoolGirl;
girlLjj.setName("李娇娇");
Proxy boyDl = new Proxy(girlLjj);
boyDl.giveDolls();
boyDl.giveChocolate();
boyDl.giveFlowers();