定义一个接口

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. 201521123044 《Java程序设计》第4周学习总结

    1. 本章学习总结 2. 书面作业 1. 注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) 答: 2. 面向对象设计(大作业1,非常重要) 2.1 ...

  2. 201521123093 java 第一周总结

    201521123093 <Java程序设计> 第一周学习总结 1.本周学习总结 (1)第一次开始接触java语言,java的用法和C不太一样.在编程序时语句比以前的长. (2)学会了使用 ...

  3. 巧用 BootStrap --- 栅格系统(布局)轻松搞定网页响应式布局!

    摘要:Bootstrap 为我们提供了一套响应式.移动设备优先的流式栅格系统,合理的使用栅格系统将会使得网站页面布局变得更加简单,在设置了媒体查询之后,响应式网站也无需再单独写了.接下来我以Boots ...

  4. mongodb 与关系型数据库

    设计 MongDB 模式时应注意的问题 根据用户需求来设计模式. 如果想一起使用对象,请将这些对象合并到一个文档中,否则要将它们分开(但是要确保不需要连接). 经常复制数据(但要有一定限度),因为与计 ...

  5. [python学习笔记] 开篇

    今天开始学习markdown,立贴为证. 平均一天一小时.两个月先学完基础. 所有的帖子只为了学习记录,有不对的请提出,轻吐槽

  6. 一个基于Asp.net MVC的博客类网站开源了!

    背景说明: 大学时毕业设计作品,一直闲置在硬盘了,倒想着不如开源出来,也许会对一些人有帮助呢,而且个人觉得这个网站做得还是不错了,毕竟是花了不少心思,希望对你有所帮助. github地址:https: ...

  7. IDEA- idea代码调试debug

    IDEA有很多的快捷键,下面整理Debug的快捷键,方便自己使用!(阅读本篇可能花费您2分钟,需要多的实践练习) F9 resume programe 恢复程序 Alt+F10 show execut ...

  8. 第6章 Overlapped I/O, 在你身后变戏法 ---Win32 文件操作函数 -2

    Win32 之中有三个基本的函数用来执行 I/O,它们是:        i CreateFile()        i ReadFile()        i WriteFile()    没有另外 ...

  9. #翻译#原文来自Database.System.Concepts(6th.Edition.2010)2.6Relational Operations,原文作者Abraham Silberschaz , Henry F. Korth , S. Sudarshan

    2.6关系操作 所有的过程关系查询语言都提供一组操作,这些操作可以应用于单个关系或一对关系.这些操作具有良好的和期望的属性,它们的结果总是一个单一的关系.这个属性允许一个以模块化的方式组合其中的几个操 ...

  10. VirtualBox安装linux mint教程

    准备工作: 1.VirtualBox安装包,官方下载页面. 2.linux mint镜像iso文件,官方下载页面. 安装过程: 1.打开VirtualBox后点击新建,在弹出界面选择专家模式,类型选择 ...