通常遇到這些需求時,會用最簡單的做法去解決問題,使用Utils class專為這個需求
寫一個method,然後呢...然後就完成了,就這樣過了一陣子之後會發現,越來越多的Utils class
在處理這些特殊字元,然後等到要做refactor時就發現,這邊一些code,那邊一些code,以為改完了,結果發現又漏了一些沒改到,其實我們可以在開始的時候就將問題先narrow down,
Decorate Pattern
此pattern主要的特色就是你可以在你原本的東西上面任意加上想要的配料。
怎麼說呢? 例如手搖飲料店,今天我想喝珍珠 + 椰果 + 仙草 + 奶茶。
我總不可能為了他寫一個Utils class吧。那如果有人要點
珍珠 + 椰果 + 仙草 + 奶茶 去 仙草, 那我的程式碼不就重複了。
最好的做法是甚麼?
珍珠,椰果,仙草,這些配料我可以隨意添加,然後最後在配上我的茶類即可。
這就是Decorate Pattern的概念。
回到原本的需求,為了達到這個目標,我目前會有三個class
RedString , Image, 可以把這些當作任意添加的配料,然後最終還是得配上 String
所以,依照這樣的配置,我會寫出類似下面的code
public interface EndDecorate { public CharSequence getCharSequence(); public static class MyEndDecorate implements EndDecorate{ private String str; public MyEndDecorate(String _str){ str = _str; } @Override public CharSequence getCharSequence() { SpannableString span = new SpannableString(str); return span; } } public static class StringDecorate implements EndDecorate { private EndDecorate nexDecorate; public StringDecorate(EndDecorate _nexDecorate){ nexDecorate = _nexDecorate; } @Override public CharSequence getCharSequence() { return nexDecorate.getCharSequence(); } } public static class AddStringDecorate extends StringDecorate{ private String newString; public AddStringDecorate(EndDecorate _nexDecorate,String _newString) { super(_nexDecorate); newString = _newString; } @Override public CharSequence getCharSequence() { SpannableString span = new SpannableString(newString); return TextUtils.concat(super.getCharSequence(),span); } } public static class RedStringDecorate extends StringDecorate{ private String RedString; public RedStringDecorate(EndDecorate _nexDecorate,String _RedString) { super(_nexDecorate); RedString = _RedString; } @Override public CharSequence getCharSequence() { SpannableString span = new SpannableString(RedString); span.setSpan(new ForegroundColorSpan(Color.RED), 0, span.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); return TextUtils.concat(super.getCharSequence(),span); } } public static class ImageDecorate extends StringDecorate{ Drawable drawable; public ImageDecorate(EndDecorate _nexDecorate,Drawable _drawable) { super(_nexDecorate); drawable = _drawable; } @Override public CharSequence getCharSequence() { SpannableString spannable = new SpannableString(" "); ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); spannable.setSpan(span, 0, spannable.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); return TextUtils.concat(super.getCharSequence(),spannable); } } }
接著要怎麼使用呢
Drawable draw = getResources().getDrawable(android.R.drawable.ic_menu_search); draw.setBounds(0, 0, 70, 70); EndDecorate img = new ImageDecorate(myend,draw); EndDecorate add = new AddStringDecorate(img," searchButton "); ((EditText)rootView.findViewById(R.id.textview)).setHint(add.getCharSequence());
這樣就可以將想要的圖片和字套用到我的textview中了,
用起來很方便,而且維護起來也很容易,每個class 都只負責自己該添加的東西,
不過目前有遇到圖片無法自動置中的問題,我也還沒有解決的方法,或許之後會找到解決方法再提供給大家。
沒有留言:
張貼留言