文档章节

Android小白的探索:2D绘图之Android简易版Microsoft Visio学习之路 三、装饰者模式

z
 zhenghaoLi
发布于 2017/09/10 18:14
字数 648
阅读 18
收藏 0

    在Microsoft Visio中点击一个图像,会在这个图像边缘出现一个方形的框,现在来实现这个框。

写之前强烈推荐一下别人写的博客,简单明了http://blog.csdn.net/jason0539/article/details/22713711

    当我们想要对一个类或多个类的功能进行扩充,通常就在这个类或父类中做改变,装饰着模式,就是在不改变原有类的功能属性的情况下,对这个类进行动态的扩展,而这个类什么也不用管,只需用自己做自己的就好了。

    装饰着模式,很重要的一点就是,装饰者类与被装饰者类要实现共同的接口。装饰者类,面向的不是对类,而是接口,通过对接口的操作,来实现对类的扩展。

    被装饰的类的接口

public interface DataInterface {
    public void addChild(DataInterface baseData);
    public void removeChild(int index);
    public void move(float moveX ,float moveY);
    public void draw(Canvas canvas);
    public List<DataInterface> getChild();
    public DataType[] pointIsInside(float moveX , float moveY);
    public void writer(BufferedWriter bufferedWriter);
    public DataInterface read(BufferedReader bufferedReader);
    public float[] getMaxMinXY(boolean checkOrRadio);
}

这个接口中,与我上一篇博客,最大的不同,是,传入的参数不再是一个父类,而是一个接口,凡是实现这个接口的类都能传入

    装饰者类的接口

public interface DecorationModeInterface extends DataInterface {
}

装饰者类有自己扩展这个类的接口:

private boolean aBoolean ;
private float[] floats;
private DataInterface dataInterface;
public DecorationMode(DataInterface dataInterface){
    this.dataInterface = dataInterface;
}

@Override
public void addChild(DataInterface baseData) {
    this.dataInterface.addChild(baseData);
}

@Override
public void removeChild(int index) {
    this.dataInterface.removeChild(index);
}

@Override
public void move(float moveX, float moveY) {
    this.dataInterface.move(moveX , moveY);
}

@Override
public void draw(Canvas canvas) {
    this.dataInterface.draw(canvas);

    if (isaBoolean()) {
        drawRectangle(getFloats(), canvas);
        setaBoolean(false);
    }
}

@Override
public List<DataInterface> getChild() {
    return this.dataInterface.getChild();
}

@Override
public DataType[] pointIsInside(float moveX, float moveY) {
    return this.dataInterface.pointIsInside(moveX,moveY);
}

@Override
public void writer(BufferedWriter bufferedWriter) {
    this.dataInterface.writer(bufferedWriter);
}

@Override
public DataInterface read(BufferedReader bufferedReader) {
    return this.dataInterface.read(bufferedReader);
}

@Override
public float[] getMaxMinXY(boolean checkOrRadio) {

    float[] floats = this.dataInterface.getMaxMinXY(checkOrRadio);
    float[] floats1 = {floats[0] - 10 ,floats[1] - 10 ,floats[2] + 10,floats[3] + 10};
    setFloats(floats1);
    setaBoolean(checkOrRadio);

    return getFloats();
}

public boolean isaBoolean() {
    return aBoolean;
}

public void setaBoolean(boolean aBoolean) {
    this.aBoolean = aBoolean;
}

public float[] getFloats() {
    return floats;
}

public void setFloats(float[] floats) {
    this.floats = floats;
}

//float left, float top, float right, float bottom
private RectangleData rectangleData = new RectangleData();
void drawRectangle(float[] floats ,Canvas canvas){
    rectangleData.setRectF(new RectF(floats[0] , floats[1],floats[2],floats[3]));
    rectangleData.setPaintAlpha(100);
    rectangleData.setPaintStyle(Paint.Style.STROKE);
    rectangleData.setPaintColor(Color.RED);
    rectangleData.setWight(10);
    rectangleData.draw(canvas);
}

drawRectangle:为需要画框出来的类,画出来。

    装饰者类,其实就是在 所有需要被装饰的类的外面,嵌套一层 装饰者类,用装饰着类去包裹住被装饰者,调用装饰者,在装饰着中执行扩展的方法,然后执行原有的方法。实现对类的扩展

 

© 著作权归作者所有

共有 人打赏支持
z
粉丝 7
博文 6
码字总数 7900
作品 0
眉山
私信 提问
支持常用的图表、仪表和地图类型的图表控件TeeChart Java for Android

TeeChart Java for Android控件是针对Google的Android操作系统设计的图表控件,支持常用的图表、仪表和地图类型 具体功能: 默认支持Android v2.1以及更高的多点触摸版 提供了50多种图表样式...

baobiaokongjian
2014/06/21
0
1
众多Android开源项目推荐

标签:android 开源 原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和本声明。否则将追究法律责任。http://terryblog.blog.51cto.com/1764499/547777 FBReaderJ ...

effort_fan
2011/05/10
0
3
09、装饰模式--Decorator

PS:转载请注明出处 作者: TigerChain 地址: https://www.jianshu.com/p/f7ff52ae44a0 本文出自 TigerChain 简书 人人都会设计模式 教程简介 1、阅读对象 本篇教程适合新手阅读,老手直接略过...

TigerChain
前天
0
0
android自学笔记《三》——系统架构分析

下面是Android的系统架构图 翻译后 从上图中可以看出,Android系统架构为4层结构,从上层到下层分别是应用程序层、应用程序框架层、系统运行库层以及Linux内核层,分别介绍如下: 1)应用程序...

郭子
2012/02/03
0
5
Design Patterns in Android:装饰模式

装饰模式是干嘛的呢?它在项目中有哪些用途呢?装饰模式在Android源码中有哪些应用呢?本文将和读者朋友一起分享探讨装饰者模式在Android中的应用和实践。 转载请注明出处。 装饰模式定义 装...

MichaelX
10/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

想买的书

Java并发编程之美

miaojiangmin
5分钟前
1
0
Linux(centos7)共享文件

安装samba samba安装 关闭防火墙和selinux firewalld /etc/selinux/config SELINUX=enforcing改为SELINUX=disabled yum install -y samba samba-client systemctl start smb smbpasswd -a 用......

qinjiudong
7分钟前
1
0
SparkLauncher执行spark程序一直阻塞卡在running-undefined的情况处理

使用SparkLauncher提交spark程序时,有时间会一直卡在status是running状态 finalstatus为undefined,这种情况是因为使用的java的ProcessBuilder,查阅了资料后发现可能是因为buffer被填满,导...

那年的暖风
11分钟前
1
0
php中echo(),print(),print_r(),var_dump()与var_export()间的区别

echo()函数:输出一个或多个字符串。 输出所有参数。不会换行。 echo 不是一个函数(它是一个语言结构), 因此你不一定要使用小括号来指明参数,单引号,双引号都可以。 echo (不像其他语言...

hansonwong
11分钟前
0
0
php 生成 桌面快捷链接

<?php $Shortcut = "[InternetShortcut] URL=http://IP地址或网址IDList= [{000214A0-0000-0000-C000-000000000046}] Prop3=19,2 "; Header("Content-type: application......

zxcgzq
12分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部