咸阳做网站xymokj,有后台的网站怎么做,网站搭建模板素材,怎么看别人网站在哪里做的外链文章目录 引言正文适配器模式学习篮球翻译适配器 面试题 代理模式学习面试题 装饰器模式学习装饰模式总结 面试题 总结 引言
为了一雪前耻#xff0c;之前腾讯面试的极其差#xff0c;设计模式一点都不会#xff0c;这里找了一点设计模式的面试题#xff0c;就针对几个常考… 文章目录 引言正文适配器模式学习篮球翻译适配器 面试题 代理模式学习面试题 装饰器模式学习装饰模式总结 面试题 总结 引言
为了一雪前耻之前腾讯面试的极其差设计模式一点都不会这里找了一点设计模式的面试题就针对几个常考的设计模式按照学习 面试题 总结的方式进行学习今天应该是最后的几个设计模式的学习了。之前的几个设计模式的学习链接如下单例模式、工厂模式简单工厂模式和策略模式
正文
适配器模式
学习
将一个类的接口转换成客户希望的另外一个接口 Adapter模式能够使得原本由于接口不兼容而不能一起工作的那些类能够一起工作
具体应用
系统的数据和行为都是正确的但是接口不符时应该考虑使用适配器 目的使控制范围之外的一个原有对象与某个接口匹配适配器模式主要应用于希望复用一些现存的类但是接口又与复用环境不一致的情况。
类型
类适配器用的少Java实现不了 通过多重继承对一个接口与另外一个接口进行匹配 对象适配器
对象适配器的结构图
具体代码实现样例 在上述代码中 target是具体需要调用的目标类Adaptee是需要适配的类两者无法一块协同工作彼此相互调用因为接口不匹配 创建一个Adapater对象继承自目标类target创建对应需要适配的类然后调用适配类的方法客户端只需要调用的适配器就行了可以使用目标类target的接口调用
篮球翻译适配器
这里截图记录一下书中举得姚明到NBA打球的例子 翻译者就是适配器他需要继承并实现球员类也就是目标类然后能够调用的需要适配的类的对象。 面试题
适配器模式了解吗
在开发中我们可能会使用两个类进行通信但是他们之间的接口不同同时又不方便修改任何一个类的接口这个时候就需要适配器完成衔接 将一个类的转换成另外一个类的接口使得原本两个不兼容的接口能够无缝完成对接。
说说适配器的模式的种类以及对应框架流程
类适配器 通过多继承实现适配器需要同时继承并实现目标类target和被适配的类adaptee 对象适配器 同各国类对象组合实现适配继承并实现目标类target然后调用需要适配的类进行修改。 适配器有哪些优缺点 优点
提高了类的复用组合若干关联对象形成对外统一服务的接口扩展性和灵活性好
缺点
过多使用适配器会造成代码功能和逻辑意义的混淆部分语言对继承的限制之多只能是配一个适配类
代理模式
学习
为其他对象提供一种代理以控制对这个对象的访问
具体的类图 Subject类代理类和真实类都需要实现和共用的接口 两者同时实现的的话就能同时调用共同的方法 RealSubject是真实的类是实际调用的类实现了Subject接口 Proxy代理类 保存一个引用可以让代理能够访问实体类的实例对象提供一个subject接口相同的接口就可以通过proxy来访问实体类 客户端代码 客户端要访问实体类就需要通过代理类可以通过代理类显示对于实体类的访问 代理模式的应用 远程代理 为一个对象在不同的地址空间提供局部代表隐藏一个对象存在于不同地址空间的事实Net技术中的webservice应用创建web引用的文件 虚拟代理 根据需要创建开销很大的对象通过它来存放实例化需要很长时间的真实对象HTML网页渲染中的图片代理能够立刻显示文字但是显示图片需要经过很长时间没有图片的狂就是虚拟代理相当于占位符存储了真实图片的路径和尺寸 安全代理 用来控制真实对象访问时的权限用于对象应该有不同的访问权限的时候 智能指引 调用真实对象是代理处理另外一些事
面试题
什么是代理模式
一个中间件解耦合服务提供者和使用者 使用者通过代理简洁访问服务提供者便于后者封装和控制结构性模式 静态代理和动态代理的区别 静态代理
特征 在编译期间就已经确定需要手动编写代理类代理类和目标类实现相同的接口代理类会包含对目标对象的引用并在代理方法中调用目标对象的相应方法 优点 结构清晰容易理解和维护编译时即可发现代码错误 缺点 接口方法多代理类需要实现多有的方法代码冗余每次新增都需要修改接口和方法修改代理类维护成本高
// 接口
public interface Service {void perform();
}// 目标类
public class RealService implements Service {Overridepublic void perform() {System.out.println(Performing service...);}
}// 代理类
public class StaticProxyService implements Service {private RealService realService;public StaticProxyService(RealService realService) {this.realService realService;}Overridepublic void perform() {System.out.println(Static Proxy: Before performing service...);realService.perform();System.out.println(Static Proxy: After performing service...);}
}// 使用代理
public class Main {public static void main(String[] args) {RealService realService new RealService();StaticProxyService proxyService new StaticProxyService(realService);proxyService.perform();}
}动态代理
特征 在运行期间动态 生成通过反射机制生成代理类不需要手动编写代理类Java中通过reflect.proxy实现动态代理 优点 代理类不需要手动编写减少代码量和维护成本灵活对接口中方法进行增强 缺点 使用了反射机制性能低于静态代理动态代理代码逻辑复杂理解调试困难
下面的代码确实复杂没看懂
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;// 接口
public interface Service {void perform();
}// 目标类
public class RealService implements Service {Overridepublic void perform() {System.out.println(Performing service...);}
}// 动态代理类
public class DynamicProxyHandler implements InvocationHandler {private Object target;public DynamicProxyHandler(Object target) {this.target target;}Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(Dynamic Proxy: Before performing service...);Object result method.invoke(target, args);System.out.println(Dynamic Proxy: After performing service...);return result;}
}// 使用代理
public class Main {public static void main(String[] args) {RealService realService new RealService();Service proxyService (Service) Proxy.newProxyInstance(realService.getClass().getClassLoader(),realService.getClass().getInterfaces(),new DynamicProxyHandler(realService));proxyService.perform();}
}装饰器模式
学习
装饰模式定义
动态给一个对象添加一些额外的职责就增加功能来说装饰模式比生成子类更加灵活。
装饰模式的类图 在上述结构图中各部分说明如下 Component定义一个对象接口给这些对象动态添加职责、方法和对象ConcreteComponet定义一个具体的类可以给这个对象添加一些职责Decorator装饰抽象类继承了Componet从外类扩展Component类的功能对于Component来说无需知道Decorator的存在
感觉这里比较费劲还得看一下这个代码是怎么实现的
Component抽象类
这个是具体需要执行或者说进行装饰的抽象类 ConcreteComponent类是对上一个类的具体实现也就是具体操作对象 Decorator类
也是一个抽象类继承component类需要传入一个component然后执行component的具体的方法 ConcreteDecoratorA
这个是继承了Decorator类的具体的类用来接受具体的component进行装饰增加额外的操作相当于这里增加了一个套壳
客户端代码
这里需要创建对应需要修改的具体的组件对象以及抽象类对象然后创建进行组合 本质
使用SetComponent来对对象进行包装 每一个装饰对象的实现就和如何使用这个对象离开了每一个装饰对象只关心自己的功能不需要关心如何添加到对项链中
装饰模式总结
装饰模式 * 为已有功能动态添加更多功能的一种方式
对比原始方法
如果直接在原始的类中直接增加新的功能会让原始的类更加复杂而且添加的功能一般是在某种特定情况下才会执行的特殊行为的需要并没有普遍性所以不需要添加。
解决问题
把每一个装饰的功能放在单独的类中让这个类包装她所需要装饰的对象针对执行特殊行为时客户代码就可以在运行时有选择地、按顺序地用装饰功能包装对象了。
优点
将类中的装饰功能从类中搬移出去简化原有的类
面试题
什么时装饰器模式
对现有的类对象进行包裹和封装以期望不改变类对象及其类定义的情况下为对象添加额外的功能对象结构性模式通过调用被包裹后的对象完成功能添加不直接修改现有对象的行为
装饰器模式应用场景
希望在不修改代码的情况下使用对象并且要求在运行时为对象新增额外的行为使用装饰模式使用继承扩展对象行为的方案难以实现时使用装饰器模式进行扩展如果类已经用final修饰如果要复用这个类对象可以使用修饰器
总结
一下子又让我紧张了下周一字节面试我觉得基本上没戏而且失去杭州不过要是有机会还是回去的周末回来一次也是不错的。想想就好了我就准备了一个半月去面试能进真的烧高香了。现在是四点半晚上就好好看看项目吧准备一下简历然后准备投递秋招的提前批了目前关于设计模式的基本上看完了明天可能要在收个尾还剩下责任链模式和观察者模式其他的基本上都不考。加油