一、什么是代理模式?
代理模式分为静态代理和动态代理。
代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。
举个例子:我想买一部苹果手机,但是该手机店很远,所以在本地设立一个手机店,卖的是同款苹果手机,该店铺相当于一个代理店。由于苹果手机需要去苹果工厂购买不划算,然后我想自己造山寨手机卖,同时不让用户发现。
静态代理:只存储一个对象,是固定的。
二、具体代码展示
phone类接口:
public interface Phone {
//给手机制定的规则
public void call();//能打电话
public void playGame();//能玩游戏
public void photo();//能拍照
}
真的苹果手机类:
public class Cellphone implements Phone{
//描述手机类
//描述属性
private String name;
private String color;
//构造方法
public Cellphone(){}
public Cellphone(String name,String color){
this.name = name;
this.color = color;
}
//方法
public void call(){
System.out.println("打电话很流畅");
}
public void playGame(){
System.out.println("打游戏不烫手");
}
public void photo(){
System.out.println("拍照很清晰");
}
山寨手机类:
public class Cellphon implements Phone{
//假的手机
private String name1;
private String color1;
public Cellphon(){}
public Cellphon(String name1,String color1){
this.name1 = name1;
this.color1 = color1;
}
public void call(){
System.out.println("电话打的卡顿");
}
public void photo(){
System.out.println("拍照马赛克");
}
public void playGame(){
System.out.println("玩游戏烫手");
}
}
store类接口:
public interface Store {
//商店只做一件事情---卖手机
public Phone sellPhone();
}
真的苹果工厂:
public class CellphoneStore implements Store {
//描述手机工厂
//生产手机
//手机类和工厂类是什么关系??依赖关系
//依赖关系用代码如何实现??一个类的方法里使用到另一个类的对象
//参数传递 或者 创建对象
private Cellphone productCellphone(){
Cellphone cellphone = new Cellphone("oppo","white");
return cellphone;
}
//销售手机
public Cellphone sellPhone(){
return this.productCellphone();
}
}
代理商类:
public class ProxyStore implements Store{
//代购工厂
//聚合关系
private CellphoneStore cellphoneStore = new CellphoneStore();
//生产手机---假手机
private Cellphon productCellphon(){
Cellphon cellphon = new Cellphon();
return cellphon;
}
//销售手机---有假手机、有新手机
public Phone sellPhone(){
return this.productCellphon();//假的手机
//return this.cellphoneStore.sellPhone();//真的手机
}
}
test类:用户购买手机
public class TestMain {
public static void main(String[] args) {
//表示用户
//创建的是代理工厂
Store store = new ProxyStore();
//卖手机
Phone cellphon = store.sellPhone();
cellphon.call();
cellphon.photo();
cellphon.playGame();
}
}
【运行结果】:用户从对象、方法上看不出来是真手机还是假的。