안 드 로 이 드 디자인 모델 --- 장식 디자인 모델
장식 디자인 모델 은 포장 디자인 모델 이 라 고도 부 르 는데 사용 하지 않 는 계승 방식 에서 대상 의 기능 을 확대 한다.
간단 한 실현
인터페이스 Person, 두 개의 실현 클래스 PersonA, PersonB 를 정의 합 니 다.
public interface Person {
void dressed();
}
public class PersionA implements Person {
@Override
public void dressed() {
Log.d("66", "A ");
}
}
public class PersionB implements Person {
@Override
public void dressed() {
Log.d("66", "B ");
}
}
장식 류 DecoratePerson, DecoratePerson 은 많은 기능 을 확장 할 수 있 으 며 PersonA 와 PersonB 의 내용 을 바 꿀 필요 가 없습니다.
public class DecoratePerson implements Person {
private Person mPerson;
public DecoratePerson(Person person){
this.mPerson = person;
}
@Override
public void dressed() {
Log.d("66", " ");
mPerson.dressed();
Log.d("66", " ");
}
}
호출
public void test(){
start(new DecoratePerson(new PersionA()));
start(new DecoratePerson(new PersionB()));
}
public void start(Person persion){
persion.dressed();
}
결실
2019-03-08 17:17:53.635 6133-6133/com.liys.modeldecorate D/66:
2019-03-08 17:17:53.635 6133-6133/com.liys.modeldecorate D/66: A
2019-03-08 17:17:53.635 6133-6133/com.liys.modeldecorate D/66:
2019-03-08 17:17:53.635 6133-6133/com.liys.modeldecorate D/66:
2019-03-08 17:17:53.635 6133-6133/com.liys.modeldecorate D/66: B
2019-03-08 17:17:53.635 6133-6133/com.liys.modeldecorate D/66:
3. 실제 응용
사고: RecyclerView 는 머리 와 아래쪽 레이아웃 View 대상 의 추 가 를 지원 하지 않 지만 ListView 는 지원 합 니 다.저희 가 RecyclerView 에 머리 와 꼬리 를 추가 하려 면 어떻게 해 야 하나 요?
아래 코드 는 참고 만 합 니 다: 특별히 완벽 하지 않 습 니 다.
public class WrapAdapter extends Adapter {
private final int TYPE_HEAD = 100000;
private final int TYPE_FOOT = 200000;
private Adapter mAdapter;
private View mHeadView;
private View mFootView;
private int mCount;
public WrapAdapter(@NonNull Adapter adapter){
this.mAdapter = adapter;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
Log.d("66","viewType="+viewType);
if(viewType == TYPE_HEAD) {
return new LiysViewHolder(mHeadView);
}
if(viewType>=getItemCount()-1 && mFootView!=null) {
return new LiysViewHolder(mFootView);
}
return mAdapter.onCreateViewHolder(viewGroup, viewType);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
int mAdapterPosition = position;
if(mHeadView != null){ //
if(position==0){
return;
}else{
mAdapterPosition = position-1;
}
}
if(mFootView != null){ //
if(position>=mCount-1){ //
return;
}
}
mAdapter.onBindViewHolder(viewHolder,mAdapterPosition);
}
@Override
public int getItemViewType(int position) {
if(isHeadView(position)){
return TYPE_HEAD;
}
if(isFootView(position)){
return TYPE_FOOT;
}
return position;
}
@Override
public int getItemCount() {
mCount = mAdapter.getItemCount();
if(mHeadView != null){
mCount++;
}
if(mFootView != null){
mCount++;
}
return mCount;
}
//
private boolean isHeadView(int position){
return position==0 && mHeadView != null;
}
//
private boolean isFootView(int position){
return position>=(getItemCount()-1) && mFootView != null;
}
public void addHeadView(View headView){
this.mHeadView = headView;
this.notifyDataSetChanged();
}
public void addFootView(View footView){
this.mFootView = footView;
this.notifyDataSetChanged();
}
public void removeHeadView(){
this.mHeadView = null;
this.notifyDataSetChanged();
}
public void removeFootView(){
this.mFootView = null;
this.notifyDataSetChanged();
}
class LiysViewHolder extends RecyclerView.ViewHolder {
public LiysViewHolder(@NonNull View itemView) {
super(itemView);
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.