定义一个接口

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(增强类的实现)的更多相关文章

  1. (spring-第17回【AOP基础篇】) 创建增强类

    一.   增强类包含的信息: a)   横切逻辑(插入的具体代码) b)   部分连接点信息(在方法的哪个位置插入代码,比如方法前.方法后等). 二.   增强的类型 每一种增强有一个需要实现的增强类 ...

  2. 常用上网增强类Chrome扩展(转)

    Chrome是个非常好用的浏览器,拥有丰富的扩展资源库,能够满足网民各种各样的需求,对于网民来说,通过Chrome扩展来增强上网体验是一个基本需求,但是安装过多的扩展有容易耗费大量系统资源,今天月光博 ...

  3. Spring AOP切面变成——创建增强类

    说明 Spring使用增强类定义横向逻辑,同时Spring只支持方法连接点,增量类还包含在方法的哪一点添加横切代码的方位信息.所以增强既包含横向逻辑,又包含部分连接点的信息. 类型 按着增强在目标类方 ...

  4. C#中关于增强类功能的几种方式

    C#中关于增强类功能的几种方式 本文主要讲解如何利用C#语言自身的特性来对一个类的功能进行丰富与增强,便于拓展现有项目的一些功能. 拓展方法 扩展方法被定义为静态方法,通过实例方法语法进行调用.方法的 ...

  5. C# 中一些类关系的判定方法 C#中关于增强类功能的几种方式 Asp.Net Core 轻松学-多线程之取消令牌

    1.  IsAssignableFrom实例方法 判断一个类或者接口是否继承自另一个指定的类或者接口. public interface IAnimal { } public interface ID ...

  6. Spring学习(七)——增强类

    Spring 切点 什么是切点?切点(Pointcut),每个程序类都拥有多个连接点,如一个拥有两个方法的类,这两个方法都是连接点,即连接点是程序类中客观存在的事物.但在这为数从多的连接点中,如何定位 ...

  7. Spring AOP获取不了增强类(额外方法)或无法通过getBean()获取对象

    Spring AOP获取不了增强类(额外方法)和无法通过getBean()获取对象 今天在学习AOP发现一个小问题 Spring AOP获取不了额外方法,左思右想发现是接口上出了问题 先上代码 获取不 ...

  8. Spring AOP 创建增强类

    AOP联盟为增强定义了org.aopalliance.aop.Advice接口,Spring支持5种类型的增强:     1)前置增强:org.springframework.aop.BeforeAd ...

  9. 浅谈JAVA中“增强”类的某个方法的几个中方法!

    一.继承 使用场景:能够控制这个类的构造的时候,才可以使用继承. 优点:简单容易使用, 缺点:耦合性大大的增强,不利于后期的维护,所以对于继承这种方法,谨慎使用.  代码实现:二.装饰者模式 使用场景 ...

随机推荐

  1. 201521123029《Java程序设计》第三周学习总结

    1.本周学习总结 2.书面作业 Q1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; pu ...

  2. 201521123051《java程序设计》 第一周学习总结

    1. 本章学习总结 Java可以算是从C++发展而来的,因此Java与C语言的语法应该是比较类似的.但通过初步学习1.java语言的发展过程 2.java的特点 系统简单,功能齐备. 3.java的三 ...

  3. Java中Collections的min和max方法

    方法一 public static <T extends Object & Comparable<? super T>> T min(Collection<? e ...

  4. 201521123014 《Java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 1.关于异常上次作业已经概括得差不多了,创建自己的异常时可以使用Java类库中已经定义好的类,也可自定义异常 ...

  5. Java: 类继承中 super关键字

    super 关键字的作用有两个: 1)在子类中调用超类的构造器,完成实例域参数的初始化,调用构造器的语句只能作为另一个构造器(通常指的是子类构造器)的第一条语句出现, 2)在子类中调用超类的方法,如: ...

  6. python并发编程之协程

    ---恢复内容开始--- 一.join方法 (1)开一个主线程 from threading import Thread,currentThread import time def walk(): p ...

  7. Python爬虫总结

    Python爬虫的原理:1通过URLopen()来获取到url页面, 这个过程可以加代理 2这个页面上都是字符串,所以我们而通过字符串查找的方法来获取到目标字符串,用到了正则来匹配目标re.finda ...

  8. PHP手动注入实验

    课程编写 类别 内容 实验课题名称 PHP手动注入实验 实验目的与要求 1.通过手动注入PHP页面,获取password字段名. 2.了解PHP手动注入的基本原理. 3.了解PHP手动注入的过程和基本 ...

  9. WebService的简单介绍与入门使用

    WebService是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式 ...

  10. Redis的安装以及在项目中使用Redis的一些总结和体会

    第一部分:为什么我的项目中要使用Redis 我知道有些地方没说到位,希望大神们提出来,我会吸取教训,大家共同进步! 注册时邮件激活的部分使用Redis 发送邮件时使用Redis的消息队列,减轻网站压力 ...