新浦京81707con > 首页 > 奥门新萄京83855com:Jianwoo中的设计模式,iOS购物

原标题:奥门新萄京83855com:Jianwoo中的设计模式,iOS购物

浏览次数:135 时间:2020-04-05

第二步:在View里,使用枚举将精选及加减商品区分,选拔代理方式张开回调使用

/** 商品数量变化的枚举值 */typedef enum : NSUInteger { ShopNmberChangeAdd,//加 ShopNmberChangeMin,//减 ShopNmberChangeSelected,//选择} ShopNmberChange;@protocol YYPCartCellDelegate <NSObject>- CartCell:(YYPCartCell *)cell addChangeNumberOfShop:(ShopNmberChange)change;@end@interface YYPCartCell : UITableViewCell@property (strong, nonatomic) YYPGoodsModel *model;// 创建并返回cell  (instancetype)cellWithTableView:(UITableView *)tableView;@property (nonatomic, weak) id<YYPCartCellDelegate> delegate;@end

// 选中按钮点击事件- selectBtnClick:(UIButton*)button { button.selected = !button.selected; self.model.selected = button.selected; if ([self.delegate respondsToSelector:@selector(CartCell:addChangeNumberOfShop:)]) { [self.delegate CartCell:self addChangeNumberOfShop:ShopNmberChangeSelected]; }}- changeNumberClick:(UIButton *)btn { if ([self.delegate respondsToSelector:@selector(CartCell:addChangeNumberOfShop:)]) { if ([btn isEqual:self.addBtn]) { self.numberLabel.text = [NSString stringWithFormat:@"%ld",   self.model.number]; [self.delegate CartCell:self addChangeNumberOfShop:ShopNmberChangeAdd]; } else { self.numberLabel.text = [NSString stringWithFormat:@"%ld", --self.model.number]; [self.delegate CartCell:self addChangeNumberOfShop:ShopNmberChangeMin]; } }}

何以是观看者形式?

网络有比很多样对此观看者情势的叙说,作者归纳的说个比如大概就能够领会:大家常用的QQ邮箱,有订阅功效,你订阅了二个信箱,现在这里个邮箱每趟有怎样新剧情,都会主动打招呼到您的信箱里,你并无需主动去订阅账号去看内容。当然大家进来邮箱获取邮箱是三个水滴石穿央求接口的进度,而观看者方式是二个没有必要主动就能够博取文告的一种“订阅”关系,小编订阅了您,今后您假设发送叁个音讯,笔者都能吸收接纳,有3个订阅者这就3个都能收到,为此观望者方式雷同会有“注册订阅”和“废除订阅”的三个人展馆现
小编们在开荒中有啥样场景会运用到阅览者情势吗,最分布的便是EventBus了,可是伊芙ntBus是通过评释来收获订阅者的回调方法,而笔者辈在支付中貌似是使用接口来获得回调。大家在Android中所用到的各样监听setOnclickListener,setOnLongClicklistener等也是观看者情势,只不过这里是一对一的观看者方式,多对一有未有呢,Android里那多少个addXXXListener就归属多对一的观望者格局了,追进源码你会意识内部是由此叁个聚众来爱护那个“订阅者”,说了这么多大家来聊一聊简物中利用观看者格局的场景

说明:

那是一个相比正规的购物汽车模特型 一共满含四个模块:

  • JVShopcartViewController: 购物车调节器 担任协和 ModelView 唯有100多行代码
  • JVShopcartFormat: 肩负互联网须求与逻辑处理
  • JVShopcartTableViewProxy: 作为调节器里边 TableView 的代理
  • View: 包括CellHeaderViewCountView(改动商品数的视图卡塔尔(قطر‎、BottomView(调控器尾部富含付钱开关的视图State of Qatar
  • Model: 包含 BrandModelProductModel 两层

奥门新萄京83855com 1购物车加减商品.gif

简物中的观察者方式

简物中除了选取EventBus作为发表/订阅事件总线,也选取了和煦写的观望者莫斯,简物是叁个电子商务应用软件,自然有商品详细情形分界面,而简物中的商品实际情况又有进口能够进入到别的商品,也正是足以Infiniti开荒七个商品详细情形,商品实际情况下方的购物车区域有叁个物品数量展现,点击购物车能够进来购物车分界面,旁边的增加购物车可以增加当前商品到购物车
那供给是怎样啊?笔者得以张开多少个详细的情况分界面,也得以进来购物车界面,笔者在随机一个分界面施行了丰盛商品到购物车或许在购物车列表进行了加减商品数量照旧去除了商品,都要及时更新商品数量到各样商品分界面,若是大家不用观望者格局那我们能怎么落到实处呢,大概正是在回去Activity的时候在onResume生命周期方法之处去主动调用获取购物车数量更新到分界面,只怕在时下分界面推行了丰盛购物车的方法后同不经常间也调用更新购物车数量的法子,那样抓实在能促功效益,然而这么做并不雅观相同的时候要对接一群代码,对于创新迭代也十分辛勤
对于程序中的成效,除非是关乎到算法可能硬件还是底层的事物,要促成三个符合规律化应用效率并非难与轻易的难题,恐怕初级生手也能落到实处那一个成效,运转的分界面也是一成不改变,然则对于我们来说,大家相应要想着怎样让程序有更加好的扩充性,让我们的代码有更加深档次的组织意义,那样做不是为了优良与人家的两样,而是为了让程序更健康
这种场合下的效应,即使把要立异购物车数量之处作为观察者,把管理购物车增加和删除改查结果之处作为被观望者,那大家假若给她们绑定叁个订阅与被订阅的涉嫌,并且在大家抬高、删除、校勘购物车的接口均给被订阅者发布三个翻新音讯,那那样不是具备的订阅者都能接过购物车被更正的音讯,然后获得订阅者传给我们的数目进行翻新
那大家如何是好吧,这里小编一贯动用java的Observer(订阅者卡塔尔和Observable(公布者)来兑现观看者形式,那是java直接封装好的通用的观看者情势模型,那大家怎么用吧,首先在UI逻辑类(要更新购物车多少的地点)达成Observer接口,让它成为三个观看者,况兼落成未贯彻的艺术

public class SaleDetailCategory extends Category implements Observer{

    /**
     * 购物车商品数量
     */
    @Bind(R.id.sale_number)
    TextView mSaleNumber;

    public SaleDetailCategory(BaseActivity activity) {
        super(activity);
    }

    ...

    @Override
    public void update(Observable observable, Object data) {

    }
}

下一场我们来封装一个公布者类,那首先本身大约说一下简物中是哪些收获购物车多少,因为各个购物车实体都有购物车uuid(cart_uuid, String)以致购物车物品数量(goods_number, Integer卡塔尔国,那总结购物车中货品数量的方法应该是将具备cart_uuid的goods_number加起来,因为要随时随地的改正对应购物车的多寡,所以自个儿用HashMap<String, Integer>来做,既然是翻新购物车数量的卷入类,那本来会有更新购物车列表、更新钦命购物车多少、增多购物车货色、删除购物车货色、清空购物车货色(增添物品到订单)的操作方法,那自个儿就直接将那些类贴出来,不做详细描述啦

/**
 * Created by Barry on 2017/2/11.
 */
public class ShoppingCartState extends Observable{

    /**
     * 用于返回到购物车界面是否要自动刷新的一个标识
     */
    private boolean mShoppingCartStateChanged;

    private HashMap<String, Integer> mShoppingCart = new HashMap<>();

    /**
     * 获取购物车列表成功,购物车列表刷新成功
     * @param carts
     */
    public void updateShoppingCart(List<CartBean.Cart> carts){
        mShoppingCart.clear();
        for(CartBean.Cart cart:carts){
            mShoppingCart.put(cart.getCart_uuid(), cart.getGoods_number());
        }
        notifyDataChanged();
    }

    /**
     * 获取购物车总数量
     * @return
     */
    public int getShoppingCartNumber(){
        int shoppingCartNumber = 0;
        Iterator iterator = mShoppingCart.entrySet().iterator();
        while (iterator.hasNext()){
            Map.Entry entry = (Map.Entry) iterator.next();
            Object value = entry.getValue();
            shoppingCartNumber  = ((Integer)value).intValue();
        }
        return shoppingCartNumber;
    }

    /**
     * 更新指定商品购物车数量
     * @param cart_uuid
     * @param number
     */
    public void updateCartNumber(String cart_uuid, int number){
        if(mShoppingCart.containsKey(cart_uuid)){
            mShoppingCart.put(cart_uuid, number);
        }
        notifyDataChanged();
    }

    /**
     * 获取购物车数量文案
     * @return
     */
    public String getShoppingCartNumberString(){
        return getShoppingCartNumber()   BaseUtils.getString(R.string.activity_saledetail_cart_has_sale_end);
    }

    /**
     * 商品详情添加商品到购物车成功
     * @param cart
     */
    public void addShoppingCartSuccess(CartBean.Cart cart){
        if(BaseUtils.isEmpty(cart)){
            return;
        }
        mShoppingCart.put(cart.getCart_uuid(), cart.getGoods_number());
        notifyDataChanged();
    }

    /**
     * 提交购物车商品到订单成功
     */
    public void addCartToOrderSuccess(){
        clearShoppingCart();
        notifyDataChanged();
    }

    public void deleteShoppingCartSuccess(String cart_uuid){
        if(mShoppingCart.containsKey(cart_uuid)){
            mShoppingCart.remove(cart_uuid);
        }
        notifyDataChanged();
    }

    /**
     * 清空购物车数量:提交订单到购物车|退出登录
     */
    public void clearShoppingCart(){
        mShoppingCart.clear();
        notifyDataChanged();
    }

    /**
     * 更新到观察者
     */
    public void notifyDataChanged(){
        setChanged();
        notifyObservers();
    }

    /**
     * 购物车状态改变
     */
    public void shoppingCartLoaded(){
        setShoppingCartStateChanged(false);
    }

    public boolean isShoppingCartStateChanged() {
        return mShoppingCartStateChanged;
    }

    public void setShoppingCartStateChanged(boolean shoppingCartStateChanged) {
        this.mShoppingCartStateChanged = shoppingCartStateChanged;
    }

}

那大家今后一经在相应更新购物车接口回调之处调用那个类的方法就可以,小编这里贴二个板栗吧

/**
 * Created by Barry on 2017/1/20.
 * 添加到购物车实现
 */
public class AddCartModelImpl extends BaseModelImpl implements AddCartModel {

    public AddCartModelImpl(BaseView baseView) {
        super(baseView);
    }

    @Override
    public AddCartView getListener() {
        return (AddCartView)baseView;
    }

    @Override
    public void addCart(CartParams cart) {
        addCart(cart, false);
    }

    @Override
    public void addCart(CartParams cart, boolean finish) {
        addCart(cart.getUser_uuid(), cart.getGoods_id(), cart.getGoods_img(), cart.getGoods_sn(), cart.getProduct_id(), cart.getGoods_name(), cart.getMarket_price(), cart.getGoods_price(), cart.getGoods_number(), cart.getGoods_attr(), cart.getGoods_attr_id(), finish);
    }

    @Override
    public void addCart(String user_uuid, int goods_id, String goods_img, String goods_sn, int product_id, String goods_name, String market_price, String goods_price, int goods_number, String goods_attr, String goods_attr_id, final boolean finish) {
        QHApi.addCart(user_uuid, goods_id, goods_img, goods_sn, product_id, goods_name, market_price, goods_price, goods_number, goods_attr, goods_attr_id, this, CartBean.class, new OkHttpClientManager.Callback<CartBean>() {
            @Override
            public void onFailure() {
                getListener().addCartError(NETWORK_ERROR);
            }

            @Override
            public void onResponse(CartBean o) {
                if(isEmpty(o)){
                    getListener().addCartError(ERROR);
                    return;
                }

                if(o.getStatus() != HttpCode.OK){
                    getListener().addCartError(o.getMessage());
                    return;
                }
                App.getInstance().shoppingCartStateChanged();
                getListener().addCartSuccess(finish);
                try{
                    /**
                     * 更新购物车数量
                     */
                    App.getInstance().getShoppingCartState().addShoppingCartSuccess(o.getItems().get(0));
                }catch (Exception e){
                    App.getInstance().getShoppingCartState().addShoppingCartSuccess(null);
                }
            }
        });
    }
}

那回调成功还要调用购物车数量更新包装类之后,我们的订阅者也能取得新闻,何况更新分界面啦,怎么落到实处的吗

public class SaleDetailCategory extends Category implements Observer{

    /**
     * 购物车商品数量
     */
    @Bind(R.id.sale_number)
    TextView mSaleNumber;

    public SaleDetailCategory(BaseActivity activity) {
        super(activity);
    }

    ...

    @Override
    public void update(Observable observable, Object data) {
        if(observable instanceof ShoppingCartState){
            updateShoppingCartNumber();
        }
    }

    public void updateShoppingCartNumber(){
        mSaleNumber.setText(App.getInstance().getShoppingCartState().getShoppingCartNumberString());
        if(mCartWillDestoryInTimeLayout.getVisibility() == View.VISIBLE && App.getInstance().getShoppingCartState().getShoppingCartNumber() <= 0){
            startCartWillDestoryLeaveLayoutAnimation();
        }

        if(mCartWillDestoryInTimeLayout.getVisibility() == View.GONE && App.getInstance().getShoppingCartState().getShoppingCartNumber() > 0){
            shoppingCartAddAnimation();
        }
    }
}

不过还要记得在生命周期方法中注册和撤回注册观望者哦

public class SaleDetailActivity extends BaseActivity{

    @Override
    protected void setContentView() {
        setContentView(R.layout.activity_saledetail);
    }

    @Override
    protected void initCategory() {
        category = new SaleDetailCategory(this);
    }

     @Override
    protected void doOnResume() {
        if(firstRunning){
            App.getInstance().getShoppingCartState().addObserver(category);
        }
    }

    @Override
    protected void doOnDestroy() {
        super.doOnDestroy();
        if(!BaseUtils.isEmpty(category)){
            App.getInstance().getShoppingCartState().deleteObserver(category);
        }
    }

最终贴四个落实的成效图,上传后意识,不但变的不流利况兼界面中1px的分水岭都消失殆尽了…
注意观看GIF图中底部购物车多少栏目数量的调换

奥门新萄京83855com 2

更新购物车多少

以上,完

MJShopCar_Swift

率先步:在Model里,将供给的性格自定义

// 标题@property (nonatomic, copy) NSString *title;// 价格@property (nonatomic, copy) NSString *price;// 是否选中@property (nonatomic, assign, getter=isSeleted) BOOL selected;// 选择商品数量值@property (nonatomic, assign) NSInteger number;// 商品总价@property (nonatomic, assign, readonly) double totalPrice;

招待右上角 star

本文由新浦京81707con发布于首页,转载请注明出处:奥门新萄京83855com:Jianwoo中的设计模式,iOS购物

关键词: 新浦京81707con Android... 逻辑 购物车 加减

上一篇:iTunes里不显示构建版本,权限问题

下一篇:没有了