柔性多态
时间:2022-07-25
本文章向大家介绍柔性多态,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
柔性多态
以求圆和长方形面积为例 假设其类图如图
这是个常规的多态程序设计,在子类中重写父类的getArea即可;
但是如果随着时间的变迁,还需要求圆和长方形的周长该如何呢?重新定义一个方法getPerimeter
float getPerimeter()
然后再在子类中实现。这势必造成接口及实现模块 客户端程序都需要修改并重新编译。
普通多态编程局限性:如果接口函数内容发生变化,那么相应的各实现子类必须发生变化,导致相关联的各级模块必须重新编程及编译,这即是普通多态编程的局限性 造成这一结果的主要原因是父类 子类定义的多态函数关联过强,消除这种关联性是实现柔性多态功能的关键
修改后的代码如下:
package design;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/**
* author:ycc
* @param <T>
* 描述: 柔性多态, 在父接口中定义转发方法,子类实现转发,具体转发规则由子类决定。实现增加规则时不需要重新编译接口。
*/
public interface Polymorphic<T> {
//Polymorphic function definition
T dispatch(int nID, T in) throws ReflectiveOperationException;
}
class Flexible<T> implements Polymorphic<T> {
private T in;
static class Nid {
public static List<String> methods = new ArrayList<>();
static String method1 = "method1";
static String method2 = "method2";
static {
methods.add(method1);
methods.add(method2);
}
}
@Override
public T dispatch(int nID, T in) throws ReflectiveOperationException {
this.in = in;
Method declaredMethod = this.getClass().getDeclaredMethod(Nid.methods.get(nID));
return (T) declaredMethod.invoke(this);
}
public T method1(){
//handler
return in;
}
public T method2(){
//handler
return in;
}
public static void main(String[] args)throws Exception {
Polymorphic polymorphicNonT = new Flexible();
Float dispatch = (Float) polymorphicNonT.dispatch(1, 1.0f);
System.out.println(dispatch);
Polymorphic<FlexibleBean> polymorphicHasT = new Flexible<>();
FlexibleBean dispatch1 = polymorphicHasT.dispatch(0, new FlexibleBean());
System.out.println(dispatch1);
}
}
class FlexibleBean{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "FlexibleBean{" +
"id=" + id +
", name='" + name + ''' +
'}';
}
}
在上面改写中,接口中的内容不变,而子类重写dispatch仅起到转发的作用,具体转发的函数是非多态函数。如果再需要一个方法就可以在子类中定义个方法,而接口无需再次编译。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- webpack实战——生产环境配置【中】
- MongoDB权威指南学习笔记(1)--基础知识与对文档的增删改查
- 利用 Shell 脚本实现邮件监控 Linux 系统的内存
- MongoDB权威指南学习笔记(4)--应用管理和服务器管理
- MongoDB权威指南学习笔记(3)--复制和分片
- 工作10年后,再看String s = new String("xyz") 创建了几个对象?
- MongoDB权威指南学习笔记(2)--设计应用
- 高性能MySQL学习笔记
- 【Netty之旅四】你一定看得懂的Netty客户端启动源码分析!
- dubbo(二)动态编译compiler
- HttpClient工具类
- java面试知识要点汇总(线程和锁)
- 「二八法则」的数据可视化:用帕累托图进行数据分析
- dubbo(三)服务运行容器Container
- python实现抓取web和xcx数据推送到wx和邮件