使用场景
当一个对象参数很多,显然通过构造函数创建不合适,或者设置参数顺序影响执行结果,参数是多变得,可以使用建造者模式,链式调用,灵活性高。
public class BGDrawable {
private final Builder builder;
private BGDrawable(Builder builder) {
this.builder = builder;
}
public Drawable drawable() {
GradientDrawable drawable = new GradientDrawable();
drawable.setShape(GradientDrawable.RECTANGLE);
drawable.setColor(builder.backgroundColor);
if (builder.cornerRadius > 0) {
if (builder.cornerOnlyTop) {
drawable.setCornerRadii(new float[]{builder.cornerRadius, builder.cornerRadius, builder.cornerRadius, builder.cornerRadius, 0, 0, 0, 0});
} else if (builder.cornerOnlyBottom) {
drawable.setCornerRadii(new float[]{0, 0, 0, 0, builder.cornerRadius, builder.cornerRadius, builder.cornerRadius, builder.cornerRadius});
} else {
drawable.setCornerRadius(builder.cornerRadius);
}
} else if (builder.radius != null && builder.radius.length == 8) {
drawable.setCornerRadii(builder.radius);
}
if (builder.strokeWidth > 0) {
drawable.setStroke((int) builder.strokeWidth, builder.strokeColor);
}
return drawable;
}
public static class Builder {
private int backgroundColor = Color.WHITE;
private float cornerRadius; //圆角半径
private int strokeColor = Color.TRANSPARENT;
private float strokeWidth; //外边框的宽
private boolean cornerOnlyTop; //只有上圆角
private boolean cornerOnlyBottom; //只有下圆角
private float[] radius;
public BGDrawable.Builder backgroundColor(int backgroundColor) {
this.backgroundColor = backgroundColor;
return this;
}
public BGDrawable.Builder onlyTopCorner(boolean cornerOnlyTop) {
this.cornerOnlyTop = cornerOnlyTop;
return this;
}
public BGDrawable.Builder onlyBottomCorner(boolean cornerOnlyBottom) {
this.cornerOnlyBottom = cornerOnlyBottom;
return this;
}
public BGDrawable.Builder cornerRadius(float leftTop, float rightTop, float rightBottom, float leftBottom) {
radius = new float[]{leftTop, leftTop, rightTop, rightTop, rightBottom, rightBottom, leftBottom, leftBottom};
return this;
}
public BGDrawable.Builder cornerRadius(float cornerRadius) {
this.cornerRadius = cornerRadius;
return this;
}
public BGDrawable.Builder strokeColor(int strokeColor) {
this.strokeColor = strokeColor;
return this;
}
public BGDrawable.Builder strokeWidth(float strokeWidth) {
this.strokeWidth = strokeWidth;
return this;
}
public BGDrawable build() {
return new BGDrawable(this);
}
}
}