zoukankan      html  css  js  c++  java
  • 使用IntelljIDEA生成接口的类继承图及装饰器模式

    类图生成方法###

    以一个装饰器模式实现数学运算的例子为例。

    1. 安装 Intellj Ultimate , lience server: http://xdouble.cn:8888/

    2. 在类上右键点击 class diagram :

    3. 在得到的类的框框上 “双指单击”或右键 , 选择 show Implementations :

    4. 得到的实现类列表上, Ctrl + A 全选

    5. Enter 得到类图结果,上面有 导出图片功能。

    6. 可以查看接口及实现类的覆写方法

    7. 调整布局

    8. 添加额外的类
      如果发现还有点单独的接口有关联但是不在上述继承体系里, 可以添加额外的 class diagram 并按上如法炮制。

    9. 导出图片保存

    装饰器代码###

    Function.java 函数接口, sources 是被装饰的内层函数运算。

    package zzz.study.patterns.decorator.func;
    
    public abstract class Function {
    	
    	protected Function[] sources;
    	
    	public Function(Function[] sources) {
    		this.sources = sources;
    	}
    	
    	public Function(Function f) {
    		this(new Function[] {f});
    	}
    
    	public abstract double f(double t);
    	
    	public String toString() {
    		String name = this.getClass().toString();
    		StringBuffer buf = new StringBuffer(name);
    		if (sources.length > 0) {
    			buf.append('(');
    			for (int i=0; i < sources.length; i++) {
    				if (i > 0)
    					buf.append(",");
    				buf.append(sources[i]);
    			}
    			buf.append(')');
    		}
    		return buf.toString();
    	}
    }
    

    Constant.java :常量函数

    package zzz.study.patterns.decorator.func;
    
    public class Constant extends Function {
    	
    	private double constant;
    	
    	public Constant() {
    		super(new Function[] {});
    	}
    	
    	public Constant(double constant) {
    		super(new Function[]{});
    		this.constant = constant;
    	}
    	
    	public double f(double t) {
    		return constant;
    	}
    	
    	public String toString() {
    		return Double.toString(constant);
    	}
    
    }
    

    T.java : 线性函数

    package zzz.study.patterns.decorator.func;
    
    public class T extends Function {
    
    	public T() {
    		super(new Function[] {});
    	}
    	
    	public double f(double t) {
    		return t;
    	}
    	
    	public String toString() {
    		return "t";
    	}
    	
    }
    

    Square.java :平方函数

    package zzz.study.patterns.decorator.func;
    
    public class Square extends Function {
    	
    	public Square() {
    		super(new Function[] {});
    	}
    	
    	public Square(Function f) {
    		super(new Function[] {f});
    	}
    	
    	public double f(double t) {
    		return Math.pow(sources[0].f(t),2);
    	}
    	
        public String toString() {
    		
    		StringBuffer buf = new StringBuffer("");
    		if (sources.length > 0) {
    			buf.append('(');
    			buf.append(sources[0]);
    			buf.append('^');
    			buf.append(2);
    			buf.append(')');
    		}
    		return buf.toString();
    	}
        
    }
    

    ExpDouble.java :指数函数

    package zzz.study.patterns.decorator.func;
    
    public class ExpDouble extends Function {
    	
    	private double  expDouble;  // 指数的底数
    	
    	public ExpDouble() {
    		super(new Function[] {});
    	}
    	
    	public ExpDouble(double expDouble, Function f) {
    		super(new Function[] {f});
    		this.expDouble = expDouble;
    	}	
    	
    	public double f(double t) {
    		return Math.pow(expDouble, sources[0].f(t));
    	}
    	
        public String toString() {
    		
    		StringBuffer buf = new StringBuffer("");
    		if (sources.length > 0) {
    			buf.append('(');
    			buf.append('(');
    			buf.append(expDouble);
    			buf.append(')');
    			buf.append('^');
    			buf.append(sources[0]);
    			buf.append(')');
    		}
    		return buf.toString();
    	}
      
    
    }
    

    Pow.java :幂函数

    package zzz.study.patterns.decorator.func;
    
    public class Pow extends Function {
    	
    	private double  pow;  // 幂函数的指数
    	
    	public Pow() {
    		super(new Function[] {});
    	}
    	
    	public Pow(Function f, double pow) {
    		super(new Function[] {f});
    		this.pow = pow;
    	}	
    	
    	public double f(double t) {
    		return Math.pow(sources[0].f(t), pow);
    	}
    	
        public String toString() {
    		
    		StringBuffer buf = new StringBuffer("");
    		if (sources.length > 0) {
    			buf.append('(');
    			buf.append(sources[0]);
    			buf.append('^');
    			buf.append('(');
    			buf.append(pow);
    			buf.append(')');
    			buf.append(')');
    		}
    		return buf.toString();
    	}  
    }
    

    Arithmetic.java :四则运算

    package zzz.study.patterns.decorator.func;
    
    public class Arithmetic extends  Function {
    	
    	protected char op;
    	
    	public Arithmetic(char op, Function f1, Function f2) {
    		super(new Function[] {f1, f2});
    		this.op = op;
    	}
    	
    	public double f(double t) {
    		switch(op) {
    			case '+':
    				return sources[0].f(t) + sources[1].f(t);
    			case '-':
    				return sources[0].f(t) - sources[1].f(t);
    			case '*':
    				return sources[0].f(t) * sources[1].f(t);
    			case '/':
    				return sources[0].f(t) / sources[1].f(t);
    			default:
    				return 0;
    		}
    	}
    	
    	public String toString() {
    		
    		StringBuffer buf = new StringBuffer("");
    		if (sources.length > 0) {
    			buf.append('(');
    			buf.append(sources[0]);
    			buf.append(Character.toString(op));
    			buf.append(sources[1]);
    			buf.append(')');
    		}
    		return buf.toString();
    
    	}
    
    }
    

    Sin.java , Cos.java 请读者自行完成。

    测试:

    package zzz.study.patterns.decorator;
    
    import zzz.study.patterns.decorator.func.Arithmetic;
    import zzz.study.patterns.decorator.func.Cos;
    import zzz.study.patterns.decorator.func.Function;
    import zzz.study.patterns.decorator.func.Sin;
    import zzz.study.patterns.decorator.func.Square;
    import zzz.study.patterns.decorator.func.T;
    
    public class ShowFunction {
    	
    	public static void main(String[] args) {
    		Function complexFunc = new Arithmetic('+', new Square(new Sin(new T())), new Square(new Cos(new T())));
    		System.out.println(complexFunc + " = " + complexFunc.f(100.0));
    		
    	}
    }
    

    《Java函数接口实现函数组合及装饰器模式》 一文中,使用 Function 接口有更简洁的装饰器模式实现。

  • 相关阅读:
    随时间的反向传播算法 BPTT
    实时绘制训练过程中损失和准确率的变化趋势 python keras jupyter notebook
    测试集的准确率为什么高于训练集的准确率?
    Adagrad和Stochastic梯度下降
    使用http-server在本地搭建一个HTTP服务器
    JS Promise
    npm淘宝镜像
    git子模块submodule
    git本地与远程分支
    git别名
  • 原文地址:https://www.cnblogs.com/lovesqcc/p/9283411.html
Copyright © 2011-2022 走看看