典型模式
Template Method(模板方法)
Strategy(策略模式)
Observer/Event(观察者模式)
动机(Motivation)
模式定义 定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method使子类可以不改变(复用)一个算法的结构即可重定义(override 重写)该算法的某些特定步骤。 ——《设计模式》
代码
abstract class Library {
public void run() {
step1();
if (step2()){
step3();
}
for (int i = 0; i < 4; i++) {
step4();
}
step5();
}
protected void step1() {
}
protected void step3() {
}
protected void step5() {
}
abstract boolean step2();
abstract void step4();
}
public class Application extends Library {
@Override
boolean step2() {
return true;
}
@Override
void step4() {
}
public static void main(String[] args) {
Library lib = new Application();
lib.run();
}
}
要点总结
动机(Motivation)
模式定义 定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可以独立于使用它的客户程序(稳定)而变化(扩展,子类化)。 ——《设计模式》
abstract class TaxStrategy {
abstract double Calculate(Context context);
}
class CNTax extends TaxStrategy {
@Override
double Calculate(Context context) {
return 0;
}
}
class USTax extends TaxStrategy {
@Override
double Calculate(Context context) {
return 0;
}
}
class DETax extends TaxStrategy {
@Override
double Calculate(Context context) {
return 0;
}
}
class FRTax extends TaxStrategy {
@Override
double Calculate(Context context) {
return 0;
}
}
public class SaleOrder {
TaxStrategy taxStrategy;
public SaleOrder(TaxStrategy taxStrategy) {
this.taxStrategy = taxStrategy;
}
public double CalculateTax() {
Context context = null;
double val = taxStrategy.Calculate(context);
return val;
}
}
要点总结
动机(Motivation)
模式定义 定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。 ——《设计模式》
public class MainActivity extends AppCompatActivity {
private Button mAppendButton;
private EditText mEditText;
private TextView mLabelText;
private int count=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAppendButton = (Button) findViewById(R.id.appendButton);
mEditText = (EditText) findViewById(R.id.contentEdit);
mLabelText = (TextView) findViewById(R.id.countText);
//订阅通知
mEditText.addTextChangedListener(textWatcher);
//取消订阅
//mEditText.removeTextChangedListener(textWatcher);
mAppendButton.setOnClickListener(clickListener);
}
OnClickListener clickListener = new OnClickListener() {
@Override
public void onClick(View v) {
String content = mEditText.getText().toString().trim();
//文本框内容处理
content = content + Integer.toString(count);
count++;
mEditText.setText(content);
mEditText.setSelection(content.length());//光标置于末尾
}
};
TextWatcher textWatcher = new TextWatcher() {
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
Log.i("BeforeTextChanged:", s.toString() );
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
Log.i("OnTextChanged:", s.toString() );
}
public void afterTextChanged(Editable s) {
String count = Integer.toString(s.length());
mLabelText.setText(count);
}
};
}
要点总结
Decorator(装饰模式)
Bridge(桥接模式)
动机(Motivation)
模式定义 动态(组合)地给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比生成子类(继承)更多灵活(消除重复代码&减少子类个数)。 ——《设计模式》
abstract class Stream {
public abstract char read(int number);
public abstract void seek(int position);
public abstract void write(char data);
}
//主体类
class FileStream extends Stream {
@Override
public char read(int number) {
return 0;
}
@Override
public void seek(int position) {
}
@Override
public void write(char data) {
}
}
class NetworkStream extends Stream {
@Override
public char read(int number) {
return 0;
}
@Override
public void seek(int position) {
}
@Override
public void write(char data) {
}
}
class MemoryStream extends Stream {
@Override
public char read(int number) {
return 0;
}
@Override
public void seek(int position) {
}
@Override
public void write(char data) {
}
}
//继承:接口协议
abstract class DecroratorStream extends Stream {
protected Stream s;
protected DecroratorStream(Stream s) { //可以传递Stream的子类,根据不同的主体,进行不同的活动
this.s = s;
}
}
class CroptoStream extends DecroratorStream {
//通过调用父类,实例化s
public CroptoStream(Stream s) {
super(s);
}
@Override
public char read(int number) {
s.read(number);
return 0;
}
@Override
public void seek(int position) {
s.seek(position);
}
@Override
public void write(char data) {
s.write(data);
}
}
class BufferedStream extends DecroratorStream{
//通过调用父类,实例化s
public BufferedStream(Stream s) {
super(s);
}
@Override
public char read(int number) {
s.read(number);
return 0;
}
@Override
public void seek(int position) {
s.seek(position);
}
@Override
public void write(char data) {
s.write(data);
}
}
class Client{
public static void main(String[] args) {
FileStream fileStream = new FileStream();
Stream s1 = new CroptoStream(fileStream);
Stream s2 = new BufferedStream(new MemoryStream());
Stream s3 = new CroptoStream(new BufferedStream(new NetworkStream()));
}
}
要点总结
动机(Motivation)
模式定义 将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。 ——《设计模式》
abstract class Messager {
MessageImp msgImp; //实现了MessageImp子类的功能
protected Messager(MessageImp msgImp) {
this.msgImp = msgImp;
}
public abstract void login(String username, String password);
public abstract void sendMessage(String message);
public abstract void sendPicture(Image image);
}
abstract class MessageImp{
public abstract void playSound();
public abstract void drawShape();
public abstract void writeText();
public abstract void connect();
}
//平台实现
class PCMessageImp extends MessageImp{
@Override
public void playSound() {
}
@Override
public void drawShape() {
}
@Override
public void writeText() {
}
@Override
public void connect() {
}
}
class MobileMessageImp extends MessageImp{
@Override
public void playSound() {
}
@Override
public void drawShape() {
}
@Override
public void writeText() {
}
@Override
public void connect() {
}
}
//业务抽象
class MessagerLite extends Messager{
protected MessagerLite(MessageImp msgImp) {
super(msgImp);
}
@Override
public void login(String username, String password) {
msgImp.connect();
}
@Override
public void sendMessage(String message) {
msgImp.writeText();
}
@Override
public void sendPicture(Image image) {
msgImp.drawShape();
}
}
class MessagerPerfect extends Messager{
protected MessagerPerfect(MessageImp msgImp) {
super(msgImp);
}
@Override
public void login(String username, String password) {
msgImp.playSound();
msgImp.connect();
}
@Override
public void sendMessage(String message) {
msgImp.playSound();
msgImp.writeText();
}
@Override
public void sendPicture(Image image) {
msgImp.playSound();
msgImp.drawShape();
}
}
要点总结
"对象创建“模式: 典型模式 Factory Method(工厂方法) Abstract Factory(抽象工厂模式) Prototype(原型模式) Builder(生成器)