文档章节

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

z
 zhenghaoLi
发布于 2017/09/10 18:14
字数 648
阅读 18
收藏 0
点赞 0
评论 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
眉山
Design Patterns in Android:装饰模式

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

MichaelX ⋅ 06/13 ⋅ 0

Android 网络编程 目录

Android 网络编程 目录 Android 网络编程1 Http协议 to be continued... Android 架构师之路 目录 Android 架构师之路1 UML图之用例图 Android 架构师之路2 UML图之类图 Android 架构师之路3...

香沙小熊 ⋅ 昨天 ⋅ 0

android --------学习流程图

如何快速入门和进阶安卓开发,是很多技术小白的疑问。 大家都知道,Android开发要学的技能非常多,技术更新速度还快,但是总的来说:掌握最核心的技术,最规范的开发流程,成为专业、出色的安...

切切歆语 ⋅ 05/06 ⋅ 0

OpenGL实现物体动画和视频特效

OpenGL实现视频的水印、滤镜?OpenGL实现视频的剪裁、旋转? 2D/3D物体的 旋转,平移,缩放? OpenGL图片滤镜与视频滤镜? 矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,最早来自于方...

shareus ⋅ 04/24 ⋅ 0

Android 自定义相机开发(三) —— 了解下EGL

胡说八道 如果要使用OpenGl来自定义相机,这个还是要了解下的。可能大多数开发者使用过OpengGL但是不知道EGL是什么?EGL的作用是什么?这其实一点都不奇怪,因为Android中的GlSurfaceView已经...

aserbao ⋅ 05/10 ⋅ 0

安卓自定义View进阶-事件分发机制原理

安卓自定义View进阶-事件分发机制原理 之前讲解了很多与View绘图相关的知识,你可以在 安卓自定义View教程目录 中查看到这些文章,如果你理解了这些文章,那么至少2D绘图部分不是难题了,大部...

猴亮屏 ⋅ 05/22 ⋅ 0

Android开发权威指南(第2版)新书发布

《Android开发权威指南(第二版)》是畅销书《Android开发权威指南》的升级版,内容更新超过80%,是一本全面介绍Android应用开发的专著,拥有45章精彩内容供读者学习。  《Android开发权威指...

androidguy ⋅ 2013/09/05 ⋅ 0

Android P 版本号为 9,第三个开发者预览版有这些变化

近日,Google 如期放出了 Android P 的第三个开发者预览版(以下简称 DP3)。DP3 主要面向应用开发者,将该版本操作系统的 API 等级正式确定为 API level 28,开发者可以借助相关的 SDK 面向...

h4cd ⋅ 06/10 ⋅ 0

《Android开发艺术探索》Activity | 生命周期 | 启动模式 | Flags | IntentFilter action data的匹配规则 (一)

说几点 1.文章中大部分(所有吧)的内容都是与《Android开发艺术探索》书中写的内容是一致的,所以可以说是直接copy了一遍(没办法,作者写的太好了)。 2.为什么要copy一遍呢?,主要还是为...

a_zhon ⋅ 05/09 ⋅ 0

官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?

Kotlin KTX 2月5号的时候,Google 发布了一款 Kotlin 的扩展库,叫 Android KTX,不过现在还处于预览版的状态。它能使 Android 上的 Kotlin 代码更简洁,从而提高开发者的效率和使用体验。 ...

承香墨影 ⋅ 02/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 23分钟前 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 43分钟前 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 56分钟前 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部