想做个卷帘门百度优化网站,山东网站建设公司,怀化高速网站,整人图片制作器Go和Java实现代理模式
下面通过一个用户登录的例子来说明代理模式的使用。
1、代理模式
在代理模式中#xff0c;一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
在代理模式中#xff0c;我们创建具有现有对象的对象#xff0c;以便向外界提供功能接口。…Go和Java实现代理模式
下面通过一个用户登录的例子来说明代理模式的使用。
1、代理模式
在代理模式中一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
在代理模式中我们创建具有现有对象的对象以便向外界提供功能接口。 意图为其他对象提供一种代理以控制对这个对象的访问。 主要解决在直接访问对象时带来的问题比如说要访问的对象在远程的机器上。在面向对象系统中有些 对象由于某些原因比如对象创建开销很大或者某些操作需要安全控制或者需要进程外的访问直接访 问会给使用者或者系统结构带来很多麻烦我们可以在访问此对象时加上一个对此对象的访问层。 何时使用想在访问一个类时做一些控制。 如何解决增加中间层。 关键代码实现与被代理类组合。 应用实例1、Windows 里面的快捷方式。 2、猪八戒去找高翠兰结果是孙悟空变的可以这样理解把高翠 兰的外貌抽象出来高翠兰本人和孙悟空都实现了这个接口猪八戒访问高翠兰的时候看不出来这个是孙悟 空所以说孙悟空是高翠兰代理类。 3、买火车票不一定在火车站买也可以去代售点。 4、一张支票或银行 存单是账户中资金的代理。支票在市场交易中用来代替现金并提供对签发人账号上资金的控制。 5、spring aop。 优点1、职责清晰。 2、高扩展性。 3、智能化。 缺点1、由于在客户端和真实主题之间增加了代理对象因此有些类型的代理模式可能会造成请求的处理速 度变慢。 2、实现代理模式需要额外的工作有些代理模式的实现非常复杂。 使用场景按职责来划分通常有以下使用场景 1、远程代理。 2、虚拟代理。 3、Copy-on-Write 代理。 4、保护Protect or Access代理。 5、Cache代理。 6、防火墙Firewall代理。 7、同步化 Synchronization代理。 8、智能引用Smart Reference代理。 注意事项1、和适配器模式的区别适配器模式主要改变所考虑对象的接口而代理模式不能改变所代理类 的接口。 2、和装饰器模式的区别装饰器模式为了增强功能而代理模式是为了加以控制。 适用性 远程代理 (RemoteProxy) 为一个对象在不同的地址空间提供局部代表。 虚代理 (VirtualProxy) 根据需要创建开销很大的对象。 保护代理 (ProtectionProxy) 控制对原始对象的访问。 智能指引 (SmartReference) 取代了简单的指针它在访问对象时执行一些附加操作。
2、Go实现代理模式
package proxy// IUser
type IUser interface {Login(username, password string)
}package proxyimport fmt// User
type User struct {
}func (u *User) Login(username, password string) {fmt.Println(User Login...)fmt.Println(username is username ,password is password)
}package proxyimport fmt// UserProxy
type UserProxy struct {user *User
}func NewUserProxy() *UserProxy {fmt.Println(这是代理类!)return UserProxy{user: User{},}
}// Login登录,和user实现相同的接口
func (p *UserProxy) Login(username, password string) {fmt.Println(执行代理类的login方法!)p.user.Login(username, password)
}package mainimport (. proj/proxy
)func main() {userProxy : NewUserProxy()userProxy.Login(root, root)
}# 输出
这是代理类!
执行代理类的login方法!
User Login...
username is root,password is root3、Java实现代理模式
package com.proxy;// IUser
public interface IUser {void login(String username, String password);
}package com.proxy;// User
public class User implements IUser{Overridepublic void login(String username, String password) {System.out.println(User Login...);System.out.println(username is username ,password is password);}
}package com.proxy;// UserProxy
public class UserProxy implements IUser {private IUser iuser;public UserProxy() {System.out.println(这是代理类!);iuser new User();}Overridepublic void login(String username, String password) {System.out.println(执行代理类的login方法!);iuser.login(username, password);}
}package com.proxy;public class Test {public static void main(String[] args) {IUser iUser new UserProxy();iUser.login(root,root);}
}# 输出
这是代理类!
执行代理类的login方法!
User Login...
username is root,password is root