day38(增强类的实现)
定义一个接口
package com.baidu.test;
public interface Person {
public abstract void eat();
public abstract void sleep();
}
定义一个类实现该接口
package com.baidu.test;
public class Student implements Person{
@Override
public void eat() {
System.out.println("吃饭中....");
}
@Override
public void sleep() {
System.out.println("睡觉中....");
}
}
增强类的实现(三种方式)
1.继承
必须要能控制这个(增强类)类的构造方法;
需要增强Student类(在吃饭前需要洗手)
package com.baidu.test;
public class StudentStrengthenExtends extends Student{
//我们需要在吃饭前进行洗手
@Override
public void eat() {
System.out.println("洗完手了");
super.eat();
}
}
测试:
public class Test {
public static void main(String[] args) {
Person p=new StudentStrengthenExtends();
p.eat();
}
}
输出结果:
洗完手了
吃饭中....
2.装饰者设计模式
前提:
a.增强类和被增强类不许实现相同的接口;
b.在增强类中获得被增强类的引用;
缺点:
接口中的方法过多,重写很多其他方法。
package com.baidu.test;
public class StudentStrengthenDecorate implements Person{
private Student s;
public StudentStrengthenDecorate(Student s) {
this.s=s;
}
@Override
public void sleep() {
// TODO Auto-generated method stub
}
@Override
public void eat() {
System.out.println("Decorate洗完手了");
s.eat();
}
}
测试类
public class Test {
public static void main(String[] args) {
Person p=new StudentStrengthenDecorate(new Student());
p.eat();
}
}
输出结果:
Decorate洗完手了
吃饭中....
3.动态代理
package com.baidu.test; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class StudentStrengthenProxy implements InvocationHandler{ private Person p;
public StudentStrengthenProxy(Person p) {
this.p=p;
} @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if("eat".equalsIgnoreCase(method.getName())){
System.out.println("洗手了");
method.invoke(p, args);
}
return null;
} }
测试:
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) {
Person p=new Student();
Person p1 = (Person) Proxy.newProxyInstance(p.getClass().getClassLoader(), p.getClass().getInterfaces(), new StudentStrengthenProxy(p));
p1.eat();
}
}
day38(增强类的实现)的更多相关文章
- (spring-第17回【AOP基础篇】) 创建增强类
一. 增强类包含的信息: a) 横切逻辑(插入的具体代码) b) 部分连接点信息(在方法的哪个位置插入代码,比如方法前.方法后等). 二. 增强的类型 每一种增强有一个需要实现的增强类 ...
- 常用上网增强类Chrome扩展(转)
Chrome是个非常好用的浏览器,拥有丰富的扩展资源库,能够满足网民各种各样的需求,对于网民来说,通过Chrome扩展来增强上网体验是一个基本需求,但是安装过多的扩展有容易耗费大量系统资源,今天月光博 ...
- Spring AOP切面变成——创建增强类
说明 Spring使用增强类定义横向逻辑,同时Spring只支持方法连接点,增量类还包含在方法的哪一点添加横切代码的方位信息.所以增强既包含横向逻辑,又包含部分连接点的信息. 类型 按着增强在目标类方 ...
- C#中关于增强类功能的几种方式
C#中关于增强类功能的几种方式 本文主要讲解如何利用C#语言自身的特性来对一个类的功能进行丰富与增强,便于拓展现有项目的一些功能. 拓展方法 扩展方法被定义为静态方法,通过实例方法语法进行调用.方法的 ...
- C# 中一些类关系的判定方法 C#中关于增强类功能的几种方式 Asp.Net Core 轻松学-多线程之取消令牌
1. IsAssignableFrom实例方法 判断一个类或者接口是否继承自另一个指定的类或者接口. public interface IAnimal { } public interface ID ...
- Spring学习(七)——增强类
Spring 切点 什么是切点?切点(Pointcut),每个程序类都拥有多个连接点,如一个拥有两个方法的类,这两个方法都是连接点,即连接点是程序类中客观存在的事物.但在这为数从多的连接点中,如何定位 ...
- Spring AOP获取不了增强类(额外方法)或无法通过getBean()获取对象
Spring AOP获取不了增强类(额外方法)和无法通过getBean()获取对象 今天在学习AOP发现一个小问题 Spring AOP获取不了额外方法,左思右想发现是接口上出了问题 先上代码 获取不 ...
- Spring AOP 创建增强类
AOP联盟为增强定义了org.aopalliance.aop.Advice接口,Spring支持5种类型的增强: 1)前置增强:org.springframework.aop.BeforeAd ...
- 浅谈JAVA中“增强”类的某个方法的几个中方法!
一.继承 使用场景:能够控制这个类的构造的时候,才可以使用继承. 优点:简单容易使用, 缺点:耦合性大大的增强,不利于后期的维护,所以对于继承这种方法,谨慎使用. 代码实现:二.装饰者模式 使用场景 ...
随机推荐
- bom是什么?
- 在dropwizard中使用feign,使用hystrix
前言 用惯了spring全家桶之后,试试dropwizard的Hello World也别有一帆风味.为了增强对外访问API的能力,需要引入open feign.这里简单在dropwizard中使用fe ...
- IT连创业系列:创业者逆境下的思维
距上篇文章,又半个多月过去了,是时候来一发阶段性的总结了. 可能最近比较懒,也可能是想不到写文的主题,故写文已变成越来越艰难的一个任务. 这个系列的大标题,也改了:它从<一个想法>到< ...
- Dynamic web module 版本之间的区别
Servlet 3十二月2009开发平台标准版6,6可插性,易于开发,异步ser vlet,安全,文件上传Servlet 2.5九月2005开发平台标准版5,5需要平台标准版5,支持注释Servlet ...
- .Net Core2.0 + Nginx + CentOS 部署
准备把项目往Linux上迁移,整个流程跑了一下,也遇到无数个坑...以下为亲测并修改后的完整流程... 安装ZIP yum install -y unzip zip Putty:WINDOWS上传文件 ...
- JS -- The Scope Chain 作用域链
The Scope Chain JavaScript is a lexically scoped language: the scope of a variable can be thought of ...
- VC++:创建,调用Win32动态链接库
VC++:创建,调用Win32动态链接库 概述 DLL(Dynamic Linkable Library)动态链接库,Dll可以看作一种仓库,仓库中包含了可以直接使用的变量,函数或类.仓库的发展史经历 ...
- Tomcat的四种基于HTTP协议的Connector性能比较
Tomcat从5.5版本开始,支持以下四种Connector的配置分别为: <Connector port="8081" protocol="org.apache. ...
- 运行Chromium浏览器缺少google api密钥无法登录谷歌账号的解决办法
管理员身份运行CMD,然后依次输入以下三行内容: setx GOOGLE_API_KEY "AIzaSyAUoSnO_8k-3D4-fOp-CFopA_NQAkoVCLw"setx ...
- .NET十年回顾
一. 引子 从我还是编程菜鸟时起,.NET就从来没让我失望过.总是惊喜不断. 当年我第一个项目是做个进销存.用的Winform.当时我是机电工程师.编程只是业余心血来潮而已. .NET的低门槛.V ...