当前位置:   article > 正文

设计模式 策略模式 以Android 中TextView绘制文本、颜色为背景说明_android drawtext绘制背景色

android drawtext绘制背景色

先来看看策略模式的定义:

策略模式(Strategy Pattern):策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

类图说明:




上面的定义以及模式的类图可能还是比较抽象,知道个大概,然后继续读下面的文章,读完以后再来回味,效果嘎嘣脆。大家应该都玩过武侠角色游戏,下面就以Android中TextView绘制相关的文本为背景,为大家介绍:假设现在在Activity中有一个文本标签TextView,需要对它设置文本内容、设置文本大小以及设置文本颜色

初步的代码(不用任何模式,):

package com.zhangjiaofa.textviewstrategydemo;
  1. import android.os.Bundle;
  2. import android.app.Activity;
  3. import android.graphics.Color;
  4. import android.widget.TextView;
  5. public class MainActivity extends Activity {
  6. private TextView mTextView = null;
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. mTextView = (TextView) findViewById(R.id.test);
  12. mTextView.setTextColor(Color.RED);
  13. mTextView.setText("Hello World");
  14. mTextView.setTextSize(25.0f);
  15. }
  16. }


没几分钟,你写好了上面的代码 ,这时候 假设提出了新的需求,存在一个自定义控件,就是View,同样需要在它的上面绘制文本、设置文本的颜色以及文本的尺寸的大小。


这时候,你在实际的编写代码的过程中必然会发现,代码存在的冗余以及结构上的不合理,可读性比较差。

那么怎样利用策略模式对上面的需求进行重新编码呢?看下面:

先抽象出TextView进行操作的几种行为:

1、drawTextColorBehavior  绘制文本颜色的行为

2、drawTextContentBehavior  绘制文本内容的行为

3、drawTextSizeBehavior  绘制文本字体大小的行为

既然抽象出了上面的三种行为,我们就可以抽象出下面的三个接口:

1、绘制文本颜色的接口:

  1. package com.zhangjiaofa.textviewstrategydemo;
  2. import android.widget.TextView;
  3. public interface IDrawTextColorBehavior {
  4. public void drawTextColorBehavior(TextView textview);
  5. }

2、绘制文本内容的接口:

  1. package com.zhangjiaofa.textviewstrategydemo;
  2. import android.widget.TextView;
  3. public interface IDrawTextContentBehavior {
  4. public void drawTextContentBehavior(TextView textview);
  5. }

3、绘制文本字体大小的接口:

  1. package com.zhangjiaofa.textviewstrategydemo;
  2. import android.widget.TextView;
  3. public interface IDrawTextSizeBehavior {
  4. public void drawTextSizeBehavior(TextView textview);
  5. }

接下来,定义相关的抽象接口的实现类:

1、实现绘制文本颜色的接口:

  1. package com.zhangjiaofa.textviewstrategydemo;
  2. import android.graphics.Color;
  3. import android.widget.TextView;
  4. public class DrawTextColorRedBehavior implements IDrawTextColorBehavior{
  5. @Override
  6. public void drawTextColorBehavior(TextView textview) {
  7. if (textview != null) {
  8. textview.setTextColor(Color.RED);
  9. }
  10. }
  11. }

2、实现绘制文本内容的接口:

  1. package com.zhangjiaofa.textviewstrategydemo;
  2. import android.widget.TextView;
  3. public class DrawTextContentDefaultBehavior implements IDrawTextContentBehavior{
  4. @Override
  5. public void drawTextContentBehavior(TextView textview) {
  6. if (textview != null) {
  7. textview.setText("Hello World");
  8. }
  9. }
  10. }

3、绘制文本字体大小的接口:

  1. package com.zhangjiaofa.textviewstrategydemo;
  2. import android.widget.TextView;
  3. public class DrawTextSizeBigBehavior implements IDrawTextSizeBehavior{
  4. @Override
  5. public void drawTextSizeBehavior(TextView textview) {
  6. if (textview != null) {
  7. textview.setTextSize(25.0f);
  8. }
  9. }
  10. }

同时我们需要定义一个整合算法骨架的类:

  1. package com.zhangjiaofa.textviewstrategydemo;
  2. import android.widget.TextView;
  3. public class DrawTextBehaviorController {
  4. private IDrawTextColorBehavior mIDrawTextColorBehavior = null;
  5. private IDrawTextSizeBehavior mIDrawTextSizeBehavior = null;
  6. private IDrawTextContentBehavior mIDrawTextContentBehavior = null;
  7. private TextView mTextView = null;
  8. public DrawTextBehaviorController(TextView textView) {
  9. mTextView = textView;
  10. }
  11. public void setDrawTextColorBehavior(IDrawTextColorBehavior colorBehavior) {
  12. mIDrawTextColorBehavior = colorBehavior;
  13. }
  14. public void setDrawTextSizeBehavior(IDrawTextSizeBehavior sizeBehavior) {
  15. mIDrawTextSizeBehavior = sizeBehavior;
  16. }
  17. public void setDrawTextContentBehavior(IDrawTextContentBehavior contentBehavior) {
  18. mIDrawTextContentBehavior = contentBehavior;
  19. }
  20. public void display() {
  21. mIDrawTextColorBehavior.drawTextColorBehavior(mTextView);
  22. mIDrawTextSizeBehavior.drawTextSizeBehavior(mTextView);
  23. mIDrawTextContentBehavior.drawTextContentBehavior(mTextView);
  24. }
  25. }


最后在MainActivity中进行简单的测试:

  1. package com.zhangjiaofa.textviewstrategydemo;
  2. import android.os.Bundle;
  3. import android.app.Activity;
  4. import android.widget.TextView;
  5. public class MainActivity extends Activity {
  6. private TextView mTextView = null;
  7. private DrawTextBehaviorController drawTextBehaviorController = null;
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12. mTextView = (TextView) findViewById(R.id.test);
  13. drawTextBehaviorController = new DrawTextBehaviorController(mTextView);
  14. drawTextBehaviorController
  15. .setDrawTextColorBehavior(new DrawTextColorRedBehavior());
  16. drawTextBehaviorController
  17. .setDrawTextContentBehavior(new DrawTextContentDefaultBehavior());
  18. drawTextBehaviorController
  19. .setDrawTextSizeBehavior(new DrawTextSizeBigBehavior());
  20. drawTextBehaviorController.display();
  21. }
  22. }



经过我们的修改,整体的代码的目录层次结构清晰了很多。当然这个例子本身没有特别大的实用价值,只是起到对模式的解释说明的作用。


最后总结一下OO的原则:

1、封装变化(把可能变化的代码封装起来)

2、多用组合,少用继承(我们使用组合的方式,为客户设置了算法)

3、针对接口编程,不针对实现(对于Role类的设计完全的针对角色,和技能的实现没有关系)


最后奉上 代码下载资源

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/176129
推荐阅读
相关标签
  

闽ICP备14008679号