设计模式Android 其余相关文章:
【设计模式Android】设计模式六大原则javascript
定义:为其余对象提供一种代理以控制这个对象的访问java
抽象主题能够是一个抽象类也能够是一个接口。设计模式
public interface Subject{
public void doSomeThing();
}复制代码
被代理的角色,是逻辑的具体执行者。ide
public class RealSubject implements Subject{
@Override
public void doSomeThing() {
//do some things
}
}复制代码
用来代理实际类执行逻辑post
public class Proxy implements Subject{
private Subject subject = null;
public Proxy(){
subject = new RealSubject();
}
@Override
public void doSomeThing() {
subject.doSomeThing();
}
}复制代码
在这里咱们举这样一个例子。
好比咱们在玩游戏的时候但愿找个代练,代替咱们升级打怪。这个这个代练就能够认为是一个代理。
咱们能够简单写一下作个对比:ui
咱们在这里定义一下游戏玩家的抽象行为:this
public interface IGame {
public void attack();
public void move();
public void dead();
public void update();
}复制代码
在这里咱们定义下玩家的实际行为:spa
public class GamePlayer implements IGame {
private String name;
public GamePlayer(String name){
this.name = name;
}
@Override
public void attack() {
System.out.println(name+"正在"+"攻击");
}
@Override
public void move() {
System.out.println(name+"正在"+"行走");
}
@Override
public void dead() {
System.out.println(name+"已经"+"死亡");
}
@Override
public void update() {
System.out.println(name+"已经"+"升级");
}
}复制代码
如今须要找一个类替咱们去执行咱们要执行的行为。设计
public class GamePlayerProxy implements IGame {
private IGame player = null;
public GamePlayerProxy(IGame player){
this.player = player;
}
@Override
public void attack() {
player.attack();
}
@Override
public void move() {
player.move();
}
@Override
public void dead() {
player.dead();
}
@Override
public void update() {
player.update();
}
}复制代码
咱们如今看一下应该如何在程序中调用:代理
public class Main {
public static void main(String[] args) {
IGame player = new GamePlayer("deep");
IGame proxy = new GamePlayerProxy(player);
proxy.move();
proxy.attack();
proxy.update();
proxy.dead();
}
}复制代码
有些开发者看了这篇文章可能会问,咱们在写程序中,为何要用代理模式,咱们直接商用上面提到的真是主题类RealSubject不就好了吗?
能够是能够,可是不符合咱们以前提到过的设计原则(【设计模式Android】设计模式六大原则)
在某些状况下,一个对象不适合或者不能直接引用另外一个对象,而代理对象能够在客户端和目标对象之间起到中介的做用, 其特征是代理类与委托类有一样的接口。
代理类不单单是一个隔离客户端和委托类的中介。咱们还能够借助代理来在增长一些功能,而不须要修改原有代码,严重的复合开闭原则哦。
客户端只访问代理,不访问真实角色。
就如同上文中举的例子同样。调用者只知道代理而不知道真实角色,咱们修改一下上面的例子:
public class GamePlayerProxy implements IGame {
private IGame player = null;
public GamePlayerProxy(String name){
this.player = new GamePlayer(name);
}
@Override
public void attack() {
player.attack();
}
@Override
public void move() {
player.move();
}
@Override
public void dead() {
player.dead();
}
@Override
public void update() {
player.update();
}
}复制代码
修改一下调用,能够看出:
public class Main {
public static void main(String[] args) {
IGame proxy = new GamePlayerProxy("deep");
proxy.move();
proxy.attack();
proxy.update();
proxy.dead();
}
}复制代码
强制代理比较特殊,它是经过真实角色找到代理角色,咱们仍是修改一下上面的例子的代理类:
public class GamePlayer implements IGame {
private String name;
private IGame proxy = null;
public GamePlayer(String name){
this.name = name;
}
public IGame getProxy() {
this.proxy = new GamePlayerProxy(this);
return this.proxy;
}
@Override
public void attack() {
if (this.getProxy()!=null){
System.out.println(name+"正在"+"攻击");
}else {
System.out.println("请指定代理");
}
}
@Override
public void move() {
if (this.getProxy()!=null) {
System.out.println(name + "正在" + "行走");
}else {
System.out.println("请指定代理");
}
}
@Override
public void dead() {
if (this.getProxy()!=null) {
System.out.println(name + "已经" + "死亡");
}else {
System.out.println("请指定代理");
}
}
@Override
public void update() {
if (this.getProxy()!=null) {
System.out.println(name + "已经" + "升级");
}else {
System.out.println("请指定代理");
}
}
private boolean isProxy(){
if (this.proxy == null){
return false;
}else {
return true;
}
}
}复制代码
增长一个私有方法,检查是否有指定的代理。经过这个方式你能够看出,你想绕过代理直接访问真实的类,可是,真实类,仍是给你返回代理。咱们访问以下:
public class Main {
public static void main(String[] args) {
IGame player = new GamePlayer("deep");
player.move();
player.attack();
player.update();
player.dead();
}
}复制代码
代理模式跟中介者模式容易搞混,以后的文章咱们会再介绍一下中介者模式,并进行一下对比。